django сериализует и десериализует объект с помощью SerializerMethodField - PullRequest
0 голосов
/ 20 июня 2019

Я использую djangorestframework 3.7.7

У меня есть модель «Предмет», в которой нет поля «Владелец». Сериализатор модели изделия выглядит примерно так:

class ItemSerializer(serializers.ModelSerializer):
    id = serializers.CharField(required=False, max_length=1000, allow_null=True)
    owner = serializers.SerializerMethodField()
    class Meta:
        model = Item

    fields = [
        'id',
        'owner'
    ]

    def get_owner(self, item):
        return item.package.owner if item.package else None

При сериализации с использованием:

ser_item = ItemSerializer(item)

Я получаю поле owner в ser_item.data

Но при десериализации, используя:

serializer = ItemSerializer(data=ser_item)
serializer.is_valid(raise_exception=True)
obj = Item(**serializer.validated_data)

obj не содержит поля owner. Кажется, он даже не проходит через сериализатор (при отладке).

Есть идеи, как я могу десериализовать, чтобы эти поля, которые не являются частью модели, были частью нового экземпляра?

1 Ответ

0 голосов
/ 20 июня 2019

Если вам нужно сделать owner как свойство объекта после десериализации, тогда вам нужно обновить create, update методы на основе требований, как указано в документации .

В вашем случае сериализатор может выглядеть примерно так:

class ItemSerializer(serializers.ModelSerializer):
    id = serializers.CharField(required=False, max_length=1000, allow_null=True)
    owner = serializers.SerializerMethodField()
    class Meta:
        model = Item

        fields = [
           'id',
           'owner'
        ]

    def get_owner(self, item):
         return item.package.owner if item.package else None

    def update(self, instance, validated_data):
        instance.email = validated_data.get('owner', 'default')
        return instance

    # same way for create

Кроме того, при десериализации вы должны предоставить ser_item.data вместо ser_item.Также сохраните сериализатор для запуска метода обновления / создания.(Спасибо @ user2880391 за то, что указал на это, я тоже пропустил это.)

serializer = ItemSerializer(data=ser_item.validated_data)
serializer.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...