Доступ к методу создания вложенного сериализатора - PullRequest
0 голосов
/ 07 июня 2019

У меня есть родительский сериализатор, который содержит два дочерних сериализатора.Дочерние сериализаторы используются повторно, и у них есть логика для обновления и создания.

Мои данные запроса выглядят так:

{
 'key1': [
          {'keyA': value},
          {'keyA': value}
        ]
 'key2': [
          {'keyB': value},
          {'keyB': value}
         ]
}

Это написанные мной сериализаторы,

class ParentSerializer(serializers.Serializer):
    key1 = Key1Serializer(many=True)
    key2 = Key2Serializer(many=True)

    class Meta:
    ...

Дочерние сериализаторы,

class Key1Serializer(serializers.ModelSerializer):
    keyA = serializers.CharField(required=True)
    class Meta:
       model = Key1
       fields = ('keyA')
    list_serializer_class = MultipleKey1Serializer
class Key1Serializer(serializers.ModelSerializer):
    keyB = serializers.CharField(required=True)
    class Meta:
       model = Key2
       fields = ('keyB')
    list_serializer_class = MultipleKey2Serializer

Список сериализаторов,

class MultipleKey1Serializer(serializers.ListSerializer):
    def update(self, extra_params):
        for el in self.validated_data:
           ... #update logic
class MultipleKey2Serializer(serializers.ListSerializer):
    def create(self, extra_params):
        for el in self.validated_data:
           ... #create logic

Так я инициализирую родительский сериализатор

serializer = ParentSerializer(data=request_data)
serializer.is_valid() # <- works perfectly, validates all the fields

Таким образом, вложенные сериализаторы отлично проверяют данные.Теперь все, что я хочу сделать, это вызвать метод update внутри Key1Serializer и создать метод внутри Key2Serializer.

Я попытался назвать его ленивым способом,

serializer.data['key2'].create(params)

Но этоне правильный способ сделать это.Кто-нибудь может мне помочь?

1 Ответ

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

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

def create(self, validated_data):
    k1_data = validated_data.pop('key1')
    k2_data = validated_data.pop('key2')

    instance = super().create(validated_data)

    serializer = Key1Serializer(k1_data, context=self.context, many=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()

    serializer2 = Key2Serializer(k2_data, context=self.context, many=True)
    serializer2.is_valid(raise_exception=True)
    serializer2.save()

    return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...