Выбор ответа Senior Django REST Framework обновлено
Запись во вложенный сериализатор
Вопрос
Сериализатор заказа с вложенным items = ItemSerializer(many=True) при serializer.save() падает с ошибкой про writable nested fields. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: DRF не пишет вложенные объекты сам: переопредели create/update или сделай readonly. ModelSerializer.create не знает, как создавать связанные позиции, и явно отказывается (AssertionError с подсказкой).
Варианты ответа
- DRF не пишет вложенные объекты сам: переопредели
create/updateили сделайread_onlyправильный ответ - Вложенные сериализаторы нельзя использовать в DRF для моделей со связью ForeignKey
- Нужно передать
many=False, тогда DRF создаст позиции по одной в цикле - Не хватает
select_related("items")в queryset вьюсета перед сохранением заказа
Разбор
ModelSerializer.create не знает, как создавать связанные позиции, и явно отказывается (AssertionError с подсказкой). Решение: в своём create вынуть items из validated_data, создать заказ и позиции, желательно в transaction.atomic. select_related касается чтения, а many отражает тип связи.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.