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

