Django rest-frame-work user_id related «violates not-null constraint»

У меня эта ошибка

jango.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).

Что я хочу сделать, так это вывести actionlog из javascript и установить пользователя для входа в модель.

Я установил объект 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

Я перенес def 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

Вы используете ModalSerilizer здесь, как я вижу, поэтому вам не нужно добавлять поле id явно в сериализатор. только поля, которые вы хотите настроить, должны быть там в поле сериализатора при работе с классом ModalSerilizer

Вернуться на верх