Django保存模型时报Field 'id' expected a number got SimpleLazyObject求助
错误根因
报错触发自followed_by_id = request.user这行代码:
- 模型中外键字段如果以
_id为后缀,预期接收的是关联用户的主键整数值 request.user是Django封装的SimpleLazyObject懒加载用户对象,不是数字类型,和字段预期类型不匹配,因此抛出异常
解决方案
二选一即可:
- 赋值外键字段时传入用户主键值
修改创建Followed实例的代码,改为传入request.user.id:
followed = Followed( user_id = user.id, followed_by_id = request.user.id, )
- 直接赋值外键对象(不带
_id后缀的字段名)
如果你的Followed模型中外键字段命名为followed_by,可以直接赋值用户对象,Django会自动解析主键:
followed = Followed( user = user, followed_by = request.user, )
其他潜在问题修复
你的代码还存在以下可优化/风险点,建议同步修改:
- 变量作用域风险:
followed实例仅在data.get("follow") is not None的条件下定义,如果条件不成立,后续调用followed.save()会抛出NameError,建议把save操作移到条件判断内部 - 请求响应问题:PUT是Ajax异步请求,返回
HttpResponseRedirect重定向对前端异步请求无效,建议返回JSON格式的状态响应 - 不存在的用户处理:调用
User.objects.get(id = user_id)时如果用户不存在会直接抛出500错误,建议改用get_object_or_404(User, id=user_id)捕获不存在的情况 - 重复关注校验:保存关注记录前先校验是否已经存在对应关注关系,避免重复插入抛出唯一约束异常
- 请求用户登录校验:操作前先判断
request.user.is_authenticated,避免未登录用户操作时request.user是匿名用户对象导致报错
内容的提问来源于stack exchange,提问作者Alex Blais
相关产品推荐
相关产品推荐

