Сигналы сохранения / удаления обычно полезны в ситуациях, когда вам нужно внести изменения, которые не являются полностью специфичными для рассматриваемой модели, или могут быть применены к моделям, которые имеют что-то общее, или могут быть настроены для использования в разных моделях.
Одной из распространенных задач переопределенных save
методов является автоматическое создание заголовков из некоторого текстового поля в модели. Это пример того, что, если вам нужно реализовать это для ряда моделей, выиграет от использования pre_save
сигнала, где обработчик сигнала мог бы взять имя поля заголовка и имя поля, из которого будет сгенерирован заголовок. Если у вас есть что-то подобное, любые расширенные функции, которые вы добавляете, будут также применяться ко всем моделям - например, поиск ярлыка, который вы собираетесь добавить для рассматриваемого типа модели, чтобы гарантировать уникальность.
Многоразовые приложения часто выигрывают от использования сигналов - если предоставляемые ими функциональные возможности могут быть применены к любой модели, они, как правило, (если это не является неизбежным) не хотят, чтобы пользователи напрямую изменяли свои модели, чтобы извлечь из этого пользу.
С django-mptt , например, я использовал pre_save
сигнал для управления набором полей, которые описывают древовидную структуру для модели, которая будет создана или обновлена, и pre_delete
сигнал для удаления деталей древовидной структуры для удаляемого объекта и всего его поддерево объектов перед ним, и они удаляются. Благодаря использованию сигналов, пользователи не должны добавлять или изменять save
или delete
методы на свои модели , чтобы это руководство сделало для них, они просто должны позволить Джанго-mptt знать , какие модели они хотят, чтобы управлять.
Ты спрашивал:
Есть ли какие-то преимущества в использовании диспетчера сигналов Django?
Я нашел это в django docs:
От: Переопределение стандартных методов модели
источник
save
метода»?Если вы будете использовать сигналы, вы сможете обновлять оценку обзора каждый раз, когда будет сохранена соответствующая модель оценки. Но если такая функциональность не нужна, я не вижу смысла помещать это в сигнал, это довольно модельные вещи.
источник
Это своего рода денормализация. Посмотрите на это красивое решение . Определение поля композиции на месте.
источник
Небольшое дополнение из документации Django о массовом удалении (
.delete()
метод дляQuerySet
объектов):https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects
И массовое обновление (
.update()
метод поQuerySet
объектам):https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update
источник