Выбор ответа Middle Django ORM и N+1 обновлено

Зачем save(update_fields=...)

Вопрос

Зачем вызывать obj.save(update_fields=["status"]) вместо просто obj.save()?

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

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

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

Коротко

Правильный ответ: Обновится только status, без перезаписи других полей старыми значениями. save() без аргументов делает UPDATE всех полей значениями из объекта в памяти.

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

  1. Без update_fields Django не сохраняет изменённые поля, только новые объекты
  2. Чтобы пропустить сигналы post_save и не запускать лишние обработчики
  3. Обновится только status, без перезаписи других полей старыми значениямиправильный ответ
  4. Чтобы сохранение выполнилось асинхронно и не блокировало обработку запроса

Разбор

save() без аргументов делает UPDATE всех полей значениями из объекта в памяти. Если другой запрос успел изменить, например, comment, его изменение будет затёрто. update_fields сужает UPDATE до нужных колонок, это и безопаснее, и чуть быстрее. Сигналы при этом отправляются, а асинхронности не появляется.

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

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