Выбор ответа Middle Django ORM и N+1 обновлено
Зачем save(update_fields=...)
Вопрос
Зачем вызывать obj.save(update_fields=["status"]) вместо просто obj.save()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Обновится только status, без перезаписи других полей старыми значениями. save() без аргументов делает UPDATE всех полей значениями из объекта в памяти.
Варианты ответа
- Без
update_fieldsDjango не сохраняет изменённые поля, только новые объекты - Чтобы пропустить сигналы
post_saveи не запускать лишние обработчики - Обновится только
status, без перезаписи других полей старыми значениямиправильный ответ - Чтобы сохранение выполнилось асинхронно и не блокировало обработку запроса
Разбор
save() без аргументов делает UPDATE всех полей значениями из объекта в памяти. Если другой запрос успел изменить, например, comment, его изменение будет затёрто. update_fields сужает UPDATE до нужных колонок, это и безопаснее, и чуть быстрее. Сигналы при этом отправляются, а асинхронности не появляется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Django ORM и N+1»
- Задвоение сумм при нескольких annotate
- Посчитать SQL-запросы при ленивой загрузке
- Как prefetch_related склеивает данные
- exists() и count() вместо загрузки строк
- Атомарное увеличение счётчика
- Prefetch с вложенным select_related
- transaction.atomic
- Когда выполняется QuerySet