Django中Employee关联User时字段类型不匹配错误的解决请求
问题解决:Field 'id' expected a number but got 'prashant'
问题重现
尝试从Employee模型获取user字段值时,触发错误:
Field 'id' expected a number but got unexpected 'prashant'
提供的代码文件如下:
models.py
class Employee(models.Model): First_Name = models.CharField(max_length=200,blank=False,null=False) Last_Name = models.CharField(max_length=200) DOB = models.DateField() Primary_skill=models.TextField(max_length=1000) user = models.OneToOneField(User,on_delete=models.CASCADE,null=True,blank=True) Employee_Id = models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False,unique=True)
views.py(原错误代码)
def loginp(request): page ='login' if request.method=="POST": username = request.POST.get("Username") password = request.POST.get("Password") name = Employee.objects.get(user=username) context={'use':name} try: username = Employee.objects.get(username=1) except: messages.error(request,"Invalid Username") user = authenticate(request,username=username,password=password) if user is not None: login(request,user) return render(request,'profile.html',context) else: messages.error(request,"Authentication Failed.Please Try again with correct credentials") context={'page':page} return render(request,'login.html',context)
错误原因
- 类型不匹配:
Employee.objects.get(user=username)中,user字段是关联User模型的OneToOneField,默认匹配User的id(数字类型),但这里直接传入字符串形式的用户名,导致类型校验失败。 - 逻辑错误:原代码中
username = Employee.objects.get(username=1)完全无效——Employee模型没有username字段,且硬编码id=1不符合业务逻辑,还会覆盖之前获取的用户名变量。
修复后的views.py代码
def loginp(request): page = 'login' if request.method == "POST": username = request.POST.get("Username") password = request.POST.get("Password") try: # 先通过用户名找到对应User实例 user = User.objects.get(username=username) # 再通过User实例关联查询Employee employee = Employee.objects.get(user=user) context = {'use': employee} except User.DoesNotExist: messages.error(request, "用户不存在") return render(request, 'login.html', {'page': page}) except Employee.DoesNotExist: messages.error(request, "该用户未绑定员工信息") return render(request, 'login.html', {'page': page}) # 执行登录认证 authenticated_user = authenticate(request, username=username, password=password) if authenticated_user is not None: login(request, authenticated_user) return render(request, 'profile.html', context) else: messages.error(request, "认证失败,请检查账号密码") context = {'page': page} return render(request, 'login.html', context)
关键修改点
- 关联查询修正:先通过
User.objects.get(username=username)获取合法的User实例,再用该实例作为条件查询Employee,避免类型不匹配问题。 - 异常处理优化:拆分捕获
User.DoesNotExist和Employee.DoesNotExist异常,给出更精准的错误提示。 - 逻辑顺序调整:先验证用户及关联员工的存在性,再执行登录认证,避免无效的认证操作。
- 变量冲突修复:避免覆盖
username变量,保证认证逻辑使用正确的用户名。
内容的提问来源于stack exchange,提问作者prashant sharma
相关产品推荐
相关产品推荐

