djangodjango-rest-frameworkmodel

django rest-frame-work user_id related "violates not-null constraint"


I have this error

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

What I want to do is push the actionlog from javascript and set the login user to model.

I set the CustomUser object to user row, however it still requies user_id?

my viewset,model,serializer is like this below.

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')

Thanks to @Mohit Prajapat

I moved the def create to serializer from view, now it works well.

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

Solution

  • You are using ModalSerilizer here as I see, So you don't need to add id field explicitly in serializer. only the fields you want to customize should be there in serializer field while working with ModalSerilizer class