Django: сигнал на queryset.update

Django отправляет сигналы pre/post_delete, если вы используете метод queryset.delete(), но не следует ли ему также отправлять pre/post_save на queryset.update()?

Ответ 1

Возможно, так и должно быть, но это не так. .update() не вызывает метод .save() для отдельных объектов в QuerySet, а вместо этого обновляет все в одном вызове SQL (UPDATE, как это происходит). Поскольку он не использует .save(), для него было бы непоследовательным вызывать pre- и сигналы после сохранения. Я, конечно, могу представить варианты использования, в которых можно было бы сделать это, но я также могу представить случаи, в которых он не будет. Мне кажется, что неправильный вызов сигналов pre- и post-save в данном случае является правильным, поскольку оставляет программисту большую гибкость. Нетрудно запустить эти сигналы вручную, и я думаю, что определенно лучше, если разработчики попросят программистов не забывать запускать сигналы, чтобы получить желаемое поведение, чем просить их не забывать отключать сигналы, чтобы избежать нежелательного поведения.