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

