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

Django报错IntegrityError: NOT NULL约束失败feed_like.user_id如何解决

报错原因

这个django.db.utils.IntegrityError: NOT NULL constraint failed: feed_like.user_id报错的核心原因是创建Like表记录时,user字段没有被赋值,而模型中user是外键非空字段,触发了数据库非空约束。
对应代码里的两个直接诱因:

  • 序列化器PostLikeSerializer中把user字段设置为read_only=True,序列化器不会从请求参数中读取user的值
  • 视图调用serializer.save()时没有手动传入user参数,导致入库时user_id为空
解决步骤

1. 调整接口权限(必要操作)

点赞功能需要明确用户身份,建议把视图的权限类从AllowAny改为IsAuthenticated,确保只有登录用户可以调用接口,才能拿到当前登录用户对象。

# 修改views.py的权限配置
@permission_classes((permissions.IsAuthenticated,))

如果你确实需要支持未登录用户点赞,需要修改模型的user字段允许为空:

# 修改models.py的user字段,仅当需要支持未登录点赞时使用
user = models.ForeignKey(HNUsers, related_name='likes', on_delete=models.SET_NULL, null=True, blank=True)

修改模型后需要执行python manage.py makemigrations和python manage.py migrate同步数据库结构。

2. 保存序列化器时传入用户对象

在视图中serializer.is_valid()校验通过后,调用save方法时手动传入当前登录用户:

# 修改views.py的保存逻辑
if serializer.is_valid():
    serializer.save(user=request.user)
    return Response(status=status.HTTP_201_CREATED)
可选优化
  • 视图中冗余的post = Posts.objects.get(id=data['post'])代码可以删除,序列化器会自动校验post参数的合法性,如果post不存在序列化器会自动返回错误响应,无需手动查询
  • 如果接口需要支持前端传入用户ID,只需要把序列化器中的user字段的read_only=True去掉改为可写字段即可,但这种方案存在安全风险,容易被伪造用户ID刷点赞,不推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 11:15:05