You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因

  1. 类型不匹配:Employee.objects.get(user=username)中,user字段是关联User模型的OneToOneField,默认匹配User的id(数字类型),但这里直接传入字符串形式的用户名,导致类型校验失败。
  2. 逻辑错误:原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:35:29