Выбор ответа 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 для объектов, которые подгружает для каскада).
Варианты ответа
- Да, сигнал отправится для каждой обновлённой строки отдельно
- Нет:
updateделает один SQLUPDATEбезsave()и сигналовправильный ответ - Да, но один раз на весь запрос с QuerySet в аргументе
instance - Только если в модели задано
Meta.signals = Trueдля массовых операций
Разбор
update(), bulk_create(), bulk_update() и delete() через QuerySet работают на уровне SQL и не вызывают save(), поэтому post_save не срабатывает (QuerySet.delete при этом шлёт pre_delete и post_delete для объектов, которые подгружает для каскада). Это частая причина «потерянных» побочных эффектов. Настройки Meta.signals не существует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.