我正在尝试做类似这些建议的信号装饰器的事情。除了有一个将装饰方法连接到信号的装饰器(将信号的发送者作为装饰器的参数)之外,我还想在类方法上使用装饰器。
我想像这样使用装饰器:
class ModelA(Model):
@connect.post_save(ModelB)
@classmethod
def observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
装饰器是:
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
我这样做时得到的错误是:
文件“/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py”,第 78 行,在连接中 AssertionError:信号接收器必须是可调用的。
我猜问题是@classmethod
返回一个不可调用的类方法对象。我不太了解幕后classmethod
的工作原理,但我从这个参考页面推测类方法对象在从类访问之前不会被转换为可调用对象,例如ModelA.observe_model_b_saved
. 有什么方法可以(1)将我的方法定义为模型上的类或实例方法,以及(2)直接在方法定义上使用装饰器将其连接到信号?谢谢!