Django-Signal über Decorator nach Modellmethode?
Ich versuche so etwas zu machendiese vorgeschlagenen Signaldekoratoren. Zusätzlich zu einem Decorator, der die decorated-Methode mit einem Signal verbindet (mit dem Absender des Signals als Argument für den Decorator), möchte ich den Decorator für Klassenmethoden verwenden.
Ich würde den Dekorateur gerne so benutzen:
class ModelA(Model):
@connect.post_save(ModelB)
@classmethod
def observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
Der Dekorateur ist:
from django.db.models import signals
def post_save(sender):
def decorator(view):
signals.post_save.connect(sender=sender, receiver=view)
return view
return decorator
Der Fehler, den ich dabei erhalte, ist:
File "/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 78, in connect AssertionError: Signal receivers must be callable.
Ich denke das Problem ist das@classmethod
gibt ein Klassenmethodenobjekt zurück, das nicht aufrufbar ist. Ich verstehe nicht wirklich wieclassmethod
funktioniert unter der haube, aber ich vermute abdiese Referenzseite dass das Klassenmethodenobjekt nicht in ein aufrufbares Objekt übersetzt wird, bis von der Klasse darauf zugegriffen wird, z.ModelA.observe_model_b_saved
. Kann ich meine Methode auf irgendeine Weise (1) als Klassen- oder Instanzmethode in einem Modell definieren und (2) mit einem Dekorator direkt in der Methodendefinition mit einem Signal verbinden? Vielen Dank!