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
相关产品推荐
相关产品推荐

