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

使用Django ModelViewSet开发API时遇NOT NULL约束失败问题求助

解决Django ModelViewSet创建Task时NOT NULL约束错误

问题原因

你的Task模型中user是外键字段,默认不能为空,但创建任务时没有给该字段赋值,导致数据库抛出NOT NULL constraint failed: todo_task.user_id错误。

解决方案(推荐方式)

在TaskModelViewset中重写perform_create方法,自动将当前登录用户关联到新创建的Task对象:

class TaskModelViewset(ModelViewSet):
    permission_classes = [IsAuthenticated]
    serializer_class = TaskSerializer
    queryset = Task.objects.all()

    def perform_create(self, serializer):
        # 自动赋值当前登录用户到user字段
        serializer.save(user=self.request.user)

说明

  • 你已经设置了permission_classes = [IsAuthenticated],确保只有登录用户能访问接口,self.request.user就是当前登录的用户对象。
  • 这种方式不需要前端传递用户ID,避免用户篡改数据的风险,更安全。

可选方案(不推荐)

如果确实需要前端传递用户ID,可以修改序列化器,添加user字段:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['id', 'title', 'complete', 'user']

但这种方式需要前端在POST请求中传入user的ID,存在用户传入他人ID的风险,需额外添加权限校验确保用户只能创建自己的任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:21:03