Сообщите мне, какие преимущества дает вложенный сериализатор при использовании несериализованного apis

Кто-нибудь подскажет мне, какие преимущества дает вложенный сериализатор при использовании несериализованного apis?

FYI, я пытаюсь сделать 3 вложенных сериализатора для методов create и update. Многие части опущены, но моя картина выглядит следующим образом.

# models.py
class Foo(Model):
    title = CharField(...)

class Bar(Model):
    foo = ForeignKey("Foo", ...)

class Bar2(Model):
    bar = ForeignKey("Bar", ...)
# serializers.py
class Bar2WriteSerializer(ModelSerializer):
    def create(self, validated_date):
        ...
    def update(self, instance, validated_date):
        ...

class BarWriteSerializer(ModelSerializer):
    bar2 = ListField(
        child=Bar2WriteSerializer(),
        ...
        )
    def create(self, validated_date):
        ...
        bar2_serializer = self.fields["bar2"].child
        bar2_serializer.create(self, validated_data):
        ...

    def update(self, instance, validated_date):
        ...
        bar2_serializer = self.fields["bar2"].child
        bar2_serializer.update(self, instance, validated_data):
        ...

class FooWriteSerializer(ModelSerializer):
    bar = ListField(
        child=BarWriteSerializer(),
        ...
        )
    def create(self, validated_date):
        ...
        bar_serializer = self.fields["bar"].child
        bar_serializer.create(self, validated_data):
        ...

    def update(self, instance, validated_date):
        ...
        bar_serializer = self.fields["bar"].child
        bar_serializer.update(self, instance, validated_data):
        ...

В общем, я использую вложенные сериализаторы, когда мне нужен интерфейс, в котором модель B всегда читается (или создается) вместе с моделью A. Примером может быть модель Pizza с отношением "многие ко многим" к Topping.

Вы захотите разделить их на две модели, чтобы достичь нормализованной модели базы данных, но получение информации о пицце без ее начинки не имеет смысла.

Примером "создания" могут быть UserCredentials и Profile. Вы можете захотеть разделить их по соображениям безопасности, но не имеет смысла создавать UserCredentials без вложенного Profile.

Преимуществом здесь является менее сложный интерфейс. На стороне клиента вам не нужно делать сложные цепочки запросов. (Получение пиццы, затем получение начинки каждый раз.) Это также снижает накладные расходы на сервере, потому что запрос только один.

Однако есть и некоторые недостатки. Я склонен избегать вложенных сериализаторов, потому что:

  • Когда вы также хотите иметь возможность получать/создавать эти отношения по отдельности, вам понадобится либо два сериализатора, либо один более сложный сериализатор. Это требует большого количества обслуживания, чтобы все работало правильно.
  • В итоге вы можете получить несколько уровней вложенных сериализаторов, что затруднит разделение вашего API на четко определенные ресурсы.
  • Производительность сложнее контролировать, потому что вы не можете применить пагинацию к вложенному ресурсу.
Вернуться на верх