Выбор ответа Senior Django REST Framework обновлено

Запись во вложенный сериализатор

Вопрос

Сериализатор заказа с вложенным items = ItemSerializer(many=True) при serializer.save() падает с ошибкой про writable nested fields. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: DRF не пишет вложенные объекты сам: переопредели create/update или сделай readonly. ModelSerializer.create не знает, как создавать связанные позиции, и явно отказывается (AssertionError с подсказкой).

Варианты ответа

  1. DRF не пишет вложенные объекты сам: переопредели create/update или сделай read_onlyправильный ответ
  2. Вложенные сериализаторы нельзя использовать в DRF для моделей со связью ForeignKey
  3. Нужно передать many=False, тогда DRF создаст позиции по одной в цикле
  4. Не хватает select_related("items") в queryset вьюсета перед сохранением заказа

Разбор

ModelSerializer.create не знает, как создавать связанные позиции, и явно отказывается (AssertionError с подсказкой). Решение: в своём create вынуть items из validated_data, создать заказ и позиции, желательно в transaction.atomic. select_related касается чтения, а many отражает тип связи.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.