Почему сериализатор моделей сохраняет неполные данные?

class CreateWithIpMixin:
    def create(self, request, *args, **kwargs):
        created_by = request.user.id
        created_by_ip = request.META.get("REMOTE_ADDR")
        #############
        creator_info = {'created_by': created_by, "created_by_ip": created_by_ip}
        data = {**request.data, **creator_info}
        serializer = self.get_serializer(data=data)
        #############
        serializer.is_valid(raise_exception=True)
        serializer.save()
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

request.data = {'name': 'Delhi', 'display_name': 'Delhi', 'short_code': 'DL', 'is_approved': True}

>

data = {'name': 'Delhi', 'display_name': 'Delhi', 'short_code': 'DL', 'is_approved': True, 'created_by': 4, 'created_by_ip': '127.0.0.1'}

Я передаю полные данные в сериализатор, но получаю только request.data в моем сериализаторе (метод validate). Два других поля 'created_by' , 'created_by_ip' присутствуют в моей модели, но я хочу заполнить эти колонки автоматически, поэтому я не указал их в полях сериализатора, также я не хочу возвращать их после сохранения данных.

Serializer.py

class StateSerializer(serializers.ModelSerializer):
    class Meta:
        model = States
        fields = [
            "id",
            "name",
            "display_name",
            "short_code",
        ]

    def validate(self, attrs):
        print(attrs, "Attrs")
        return super().validate(attrs)

Я не понимаю, почему вы не хотите включить эти поля в сериализатор, если вы передаете creator_info для их заполнения.

Если вы не упомянете эти поля в fields, то они будут отброшены при проверке сериализатора.

Оу. Кажется, я понял. Если вы хотите удалить некоторые поля из сериализатора, то у вас есть несколько вариантов.

  1. Сериализаторы разделения

Сделайте CreateStateSerializer, который будет принимать все необходимые поля. Сделайте ReturnStateSerializer, который будет возвращать только те данные, которые вы хотите вернуть.

Тогда просто сделайте что-то вроде:

creator_info = {'created_by': created_by, "created_by_ip": created_by_ip}
data = {**request.data, **creator_info}

create_serializer = CreateStateSerializer(data=data)
create_serializer.is_valid(raise_exception=True)
create_serializer.save()

return_serializer = ReturnStateSerializer(**create_serializer.data)
return_serializer.is_valid(raise_exception=True)
  1. pop() поля из данных сериализатора

    serializer.pop("created_by")
    serializer.pop("created_by_ip")

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