Сигналы разъединения для моделей и снова соединяются в django

Я должен сделать сохранение с моделью, но я должен разъединить некоторые получатели сигналов, прежде чем сохранят его.

Я имею в виду,

У меня есть модель:

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.

26
задан diegueus9 5 February 2010 в 17:45
поделиться

2 ответа

Я не тестировал следующий код, но он должен работать:

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
9
ответ дан 28 November 2019 в 06:24
поделиться

Если вы хотите отключить и повторно подключить только один пользовательский сигнал, вы можете использовать этот код:

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)
8
ответ дан 28 November 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: