我正在尝试做类似的事情这些建议的信号装饰器 http://code.djangoproject.com/ticket/9015。除了拥有一个将装饰方法连接到信号的装饰器(将信号的发送者作为装饰器的参数)之外,我还想在类方法上使用装饰器。
我想像这样使用装饰器:
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
当我这样做时得到的错误是:
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.
我想问题是@classmethod
返回一个不可调用的类方法对象。我真的不明白怎么办classmethod
在幕后工作,但我推测这个参考页 http://docs.python.org/reference/datamodel.html在从类访问类方法对象之前,类方法对象不会转换为可调用对象,例如,ModelA.observe_model_b_saved
。有什么方法可以(1)将我的方法定义为模型上的类或实例方法,(2)直接在方法定义上使用装饰器将其连接到信号?谢谢!
你能把它改为@staticmethod吗?这样,您只需交换装饰器的顺序即可。
class ModelA(Model):
@staticmethod
@connect.post_save(ModelB)
def observe_model_b_saved(sender, instance, created, **kwargs):
# do some stuff
pass
您必须通过全名引用该类,而不是传递 cls 参数,但这将允许您保持类似的代码组织。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)