Я должен сделать сохранение с моделью, но я должен разъединить некоторые получатели сигналов, прежде чем сохранят его.
Я имею в виду,
У меня есть модель:
class MyModel(models.Model):
...
def pre_save_model(sender, instance, **kwargs):
...
pre_save.connect(pre_save_model, sender=MyModel)
и в другом месте в коде мне нужно что-то как:
a = MyModel()
...
disconnect_signals_for_model(a)
a.save()
...
reconnect_signals_for_model(a)
Поскольку я нуждаюсь в этом случае, сохраняю модель без, выполняют функцию pre_save_model.
Я не тестировал следующий код, но он должен работать:
from django.db.models.signals import pre_save
def save_without_the_signals(instance, *args, **kwargs):
receivers = pre_save.receivers
pre_save.receivers = []
new_instance = instance.save(*args, **kwargs)
pre_save.receivers = receivers
return new_instance
Он отключит сигналы от всех отправителей, но не просто экземпляр .__ класс __
.
Эта версия отключает только сигналы данной модели:
from django.db.models.signals import pre_save
from django.dispatch.dispatcher import _make_id
def save_without_the_signals(instance, *args, **kwargs):
receivers = []
sender_id = _make_id(instance.__class__)
for index in xrange(len(self.receivers)):
if pre_save.receivers[index][0][1] == sender_id:
receivers.append(pre_save.receivers.pop(index))
new_instance = instance.save(*args, **kwargs)
pre_save.receivers.extend(receivers)
return new_instance
Если вы хотите отключить и повторно подключить только один пользовательский сигнал, вы можете использовать этот код:
def disconnect_signal(signal, receiver, sender):
disconnect = getattr(signal, 'disconnect')
disconnect(receiver, sender)
def reconnect_signal(signal, receiver, sender):
connect = getattr(signal, 'connect')
connect(receiver, sender=sender)
Таким образом, вы можете сделать это:
disconnect_signal(pre_save, pre_save_model, MyModel)
a.save()
reconnect_signal(pre_save, pre_save_model, MyModel)