Car*_*l G 8 python django decorator django-signals django-models
我正在尝试做这些提议的信号装饰器.除了有一个装饰器将装饰方法连接到一个信号(信号的发送者作为装饰器的参数),我想在类方法上使用装饰器.
我想像这样使用装饰器:
class ModelA(Model):
@connect.post_save(ModelB)
@classmethod
def observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
Run Code Online (Sandbox Code Playgroud)
装饰者是:
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
Run Code Online (Sandbox Code Playgroud)
我这样做的错误是:
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工作的,但我从这个参考页面推测,类方法对象在从类中访问之前不会被转换为可调用的,例如ModelA.observe_model_b_saved.有没有什么办法我可以(1)将我的方法定义为模型上的类或实例方法,以及(2)直接在方法定义上使用装饰器将其连接到信号?谢谢!
从您的示例代码中尚不清楚,所以我会问信号监听器是否实际上必须是@classmethod?即常规方法可以吗(self.__class__如果您仍然需要访问类本身,则可以使用)?它是否需要是一个方法(你可以只使用一个函数)吗?
另一种选择可能是使用第二种方法来监听信号并将调用委托给@classmethod:
class ModelA(Model):
@classmethod
def do_observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
@connect.post_save(ModelB)
def observe_model_b_saved(self, sender, instance, created, **kwargs):
self.do_observe_model_b_saved(sender, instance, created, **kwargs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |