Вложенные сериализаторы с возможностью записи

Для экономии HTTP-запросов может быть удобно отправлять вместе с запросом сопутствующие документы.

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

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

Структуры данных "один ко многим"

Пример вложенного сериализатора только для чтения. Здесь нет ничего сложного.

class ToDoItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = ToDoItem
        fields = ['text', 'is_completed']

class ToDoListSerializer(serializers.ModelSerializer):
    items = ToDoItemSerializer(many=True, read_only=True)

    class Meta:
        model = ToDoList
        fields = ['title', 'items']

Некоторые примеры вывода нашего сериализатора.

{
    'title': 'Leaving party preparations',
    'items': [
        {'text': 'Compile playlist', 'is_completed': True},
        {'text': 'Send invites', 'is_completed': False},
        {'text': 'Clean house', 'is_completed': False}
    ]
}

Давайте рассмотрим обновление нашей вложенной структуры данных "один ко многим".

Ошибки валидации

Добавление и удаление элементов

Выполнение PATCH-запросов

Last updated