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

Django REST Framework user_id非空约束违反问题解决

问题:Django IntegrityError:user_id字段为空违反非空约束

遇到如下错误:

django.db.utils.IntegrityError: null value in column "user_id" of relation "defapp_actionlog" violates not-null constraint
DETAIL:  Failing row contains (13, "{\"action\":\"push\"}", 2024-10-21 06:11:30.43758+00, 2024-10-21 06:11:30.43759+00, null).

我需要从JavaScript推送ActionLog,并将当前登录用户关联到模型中。已尝试将CustomUser对象设置到user字段,但系统仍提示user_id不能为空。

原代码

视图集:

class ActionLogViewSet(viewsets.ModelViewSet):
    queryset = m.ActionLog.objects.all()
    serializer_class = s.ActionLogSerializer
    
    def perform_create(self, serializer):
        obj = serializer.save()
        return obj

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)   
        request.data._mutable = True
        request.data['user'] = m.CustomUser.objects.get(id=request.user.id)
        try:
            serializer.is_valid(raise_exception=True)
        except Exception as e:
            logger.info(e)

        self.perform_create(serializer)
        return Response(serializer.data)

模型:

class ActionLog(models.Model):
    user = models.ForeignKey(CustomUser,on_delete=models.CASCADE,related_name='action_user')
    detail = models.JSONField(default=dict,null=True, blank=True) 
    created_at = models.DateTimeField(auto_now_add=True)    
    updated_at = models.DateTimeField(auto_now=True) 

序列化器:

class ActionLogSerializer(ModelSerializer):
    user = CustomUserSerializer(read_only=True,source="actionlog_user")
    detail = serializers.CharField()
    class Meta:
        model = m.ActionLog
        fields = ('id','user','detail')

解决方法

感谢@Mohit Prajapat,将create方法从视图移到序列化器中后,问题已解决。修改后的序列化器代码如下:

class ActionLogSerializer(ModelSerializer):
    user = CustomUserSerializer(read_only=True,source="actionlog_user")
    detail = serializers.CharField()
    class Meta:
        model = m.ActionLog
        fields = ('id','user','detail')
    def create(self, validated_data):
        validated_data["user"] = self.context["request"].user
        obj = m.ActionLog.objects.create(**validated_data)
        obj.save()
        return obj

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:41:03