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