Как сохранить модель без отправки сигнала? - PullRequest
22 голосов
/ 12 октября 2009

Как сохранить модель, чтобы сигналы не отправлялись. (post_save и pre_save)

Ответы [ 5 ]

41 голосов
/ 12 октября 2009

Это что-то вроде хака, но вы можете сделать что-то вроде этого:

использовать уникальный идентификатор с фильтром, а затем использовать метод обновления набора запросов (который не вызывает сигналы)

user_id = 142187
User.objects.filter(id=user_id).update(name='tom')
7 голосов
/ 17 июля 2012

Этот билет был помечен как "wontfix", потому что:

Короче говоря, это звучит так, учитывая определенное назначение сигналов, подключенный обработчик сигнала, который должен стать более интеллектуальным (как в предложении davedash), а не код, который испускает сигнал. Отключение сигналов - это просто быстрое решение, которое будет работать, когда вы точно знать, какие обработчики подключены к сигналу, и он скрывает Основная проблема, поставив исправление в неправильном месте.

1 голос
/ 12 октября 2009

В настоящее время билет ожидает решения Django для этой функции.

В тикет включено изменение для патча с предложенной реализацией.

0 голосов
/ 22 июня 2019
ModelName.objects.bulk_create([your object/objects])

также вы можете прочитать больше здесь django docs

0 голосов
/ 19 июля 2018

Если у вас есть взаимоотношения по моделям и их сигналам тем не менее, вы можете отделить логику сигнала, чтобы иметь больше сигналов одного типа, и обрабатывать свою логику более изощренным способом:

Вы можете проверить сигналы, состояние объекта:

kwargs['created']

Вы можете проверить состояние любого вставленного дополнительного значения: Итак, в одном сигнале вы сначала прочитаете:

if `kwargs['instance'].skip_signals`:
   return

и в другом месте, перед save() вы просто установите skip_signals на конкретном объекте, в конкретной ситуации. (нет необходимости определять его как поле модели)

Вы также можете не излучать сигналы:

  • путем переопределения метода (ов) на моделях,
  • или добавив собственный save_without_signals(),
  • или, как уже упоминалось, делать filter(pk=<>).update(...)
...