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

Django ForeignKey赋值报错:id字段期望数字却得到User对象如何解决

Django 外键赋值报错修复方案

错误根因

你的代码违反了Django ORM的外键字段赋值规则:
当模型定义了user = models.ForeignKey(User, on_delete=models.CASCADE)外键字段时,Django会自动生成两个可赋值属性:

  • 模型显式定义的user字段:仅接收User类的实例对象
  • 自动生成的隐式字段user_id:仅接收数字类型的用户主键ID
    你当前的代码将User实例对象cus传给了仅接受数字的user_id字段,因此触发类型错误。

两种修复方案

方案1(Django推荐写法):给user字段传实例

修改实例化AddTodo的参数,将user_id=cus改为user=cus即可:

add_task = AddTodo(task=task, priority=priority, date=date, time=time, user=cus)

方案2:给user_id字段传主键值

如果要继续使用user_id赋值,传入cus的ID属性即可:

add_task = AddTodo(task=task, priority=priority, date=date, time=time, user_id=cus.id)

代码优化建议

你代码中cus = User.objects.get(pk=request.user.id)属于冗余数据库查询,request.user本身就是当前登录用户的User实例,可以直接使用,优化后完整代码如下:

def index(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
            task = request.POST['task']
            priority = request.POST['priority']
            date = request.POST['date']
            time = request.POST['time']

            add_task = AddTodo(
                task=task,
                priority=priority,
                date=date,
                time=time,
                user=request.user
            )
            add_task.save()

            # 原判断add_task is not None无意义,实例化后必然不为空,改用pk判断是否保存成功
            if add_task.pk:
                print("task added successfully", task)
            else:
                print("task not added", task)
    return render(request, 'index.html')

内容的提问来源于stack exchange,提问作者Rajesh s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:04