Trennen Sie Signale für Modelle und wieder in django
Muss ich machen sparen Sie mit einem Modell, aber ich muss trennen, einige Empfänger der Signale, bevor Sie es speichern.
Ich meine,
Habe ich ein Modell:
class MyModel(models.Model):
...
def pre_save_model(sender, instance, **kwargs):
...
pre_save.connect(pre_save_model, sender=MyModel)
und an anderer Stelle im code ich brauche so etwas wie:
a = MyModel()
...
disconnect_signals_for_model(a)
a.save()
...
reconnect_signals_for_model(a)
Da brauche ich in diesem Fall speichern Sie das Modell ohne ausführen der Funktion pre_save_model.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für eine saubere und wiederverwendbare Lösung verwenden, können Sie einen context-manager:
Nun, können Sie etwas wie die folgende:
Hinweis: Wenn Ihr signal-handler verwendet eine
dispatch_uid
Sie MUSS verwenden Sie diedispatch_uid
arg.weak=False
ist nicht der Standard beim Anschluss von einem receiver zu einem signal.weak
ist veraltet Auch, die Menschen sollten sich bewusst sein, dass das deaktivieren eines Signals verhindern, dass all Instanzen von der Triggerung des Signals, nicht nur mit aktuellen Kontext (d.h. andere threads, wie Signale zu sein scheinen, thread-sichere), als vorgeschlagen hereKönnen Sie verbinden und trennen der Signale als Heuhaufen in RealTimeSearchIndex, das scheint mehr standard:
pre_savel_model
ist das gleiche wiepre_save
?Habe ich noch nicht getestet den folgenden code, aber es sollte funktionieren:
Wird es Stille Signale von alle Absenders aber nicht nur
instance.__class__
.Dieser version deaktiviert nur das Modell s-Signale:
Wenn Sie nur wollen, trennen Sie und schließen Sie ein benutzerdefiniertes signal, können Sie diesen code verwenden:
Auf diese Weise können Sie diese:
Ich brauchte, um zu verhindern, dass bestimmte Signale von feuern während unittests also machte ich einen Dekorator basiert auf qris Antwort:
Verwendung ist einfach: