Сигналы сохранения / удаления обычно полезны в ситуациях, когда вам нужно внести изменения, которые не являются полностью специфичными для рассматриваемой модели, или могут быть применены к моделям, которые имеют что-то общее, или могут быть настроены для использования в разных моделях.
Одной из распространенных задач переопределенных save
методов является автоматическое создание заголовков из некоторого текстового поля в модели. Это пример того, что, если вам нужно реализовать это для ряда моделей, выиграет от использования pre_save
сигнала, где обработчик сигнала мог бы взять имя поля заголовка и имя поля, из которого будет сгенерирован заголовок. Если у вас есть что-то подобное, любые расширенные функции, которые вы добавляете, будут также применяться ко всем моделям - например, поиск ярлыка, который вы собираетесь добавить для рассматриваемого типа модели, чтобы гарантировать уникальность.
Многоразовые приложения часто выигрывают от использования сигналов - если предоставляемые ими функциональные возможности могут быть применены к любой модели, они, как правило, (если это не является неизбежным) не хотят, чтобы пользователи напрямую изменяли свои модели, чтобы извлечь из этого пользу.
С django-mptt , например, я использовал pre_save
сигнал для управления набором полей, которые описывают древовидную структуру для модели, которая будет создана или обновлена, и pre_delete
сигнал для удаления деталей древовидной структуры для удаляемого объекта и всего его поддерево объектов перед ним, и они удаляются. Благодаря использованию сигналов, пользователи не должны добавлять или изменять save
или delete
методы на свои модели , чтобы это руководство сделало для них, они просто должны позволить Джанго-mptt знать , какие модели они хотят, чтобы управлять.