Выбор ответа Middle Django: устройство спрашивают часто обновлено

Сигналы и массовые операции

Вопрос

Обработчик post_save у модели Order отправляет письмо. Сработает ли он при Order.objects.filter(...).update(status="paid")?

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

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

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

Коротко

Правильный ответ: Нет: update делает один SQL UPDATE без save() и сигналов. update(), bulkcreate(), bulkupdate() и delete() через QuerySet работают на уровне SQL и не вызывают save(), поэтому postsave не срабатывает (QuerySet.delete при этом шлёт predelete и postdelete для объектов, которые подгружает для каскада).

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

  1. Да, сигнал отправится для каждой обновлённой строки отдельно
  2. Нет: update делает один SQL UPDATE без save() и сигналовправильный ответ
  3. Да, но один раз на весь запрос с QuerySet в аргументе instance
  4. Только если в модели задано Meta.signals = True для массовых операций

Разбор

update(), bulk_create(), bulk_update() и delete() через QuerySet работают на уровне SQL и не вызывают save(), поэтому post_save не срабатывает (QuerySet.delete при этом шлёт pre_delete и post_delete для объектов, которые подгружает для каскада). Это частая причина «потерянных» побочных эффектов. Настройки Meta.signals не существует.

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

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