gpt4 book ai didi

python - Django 在模型方法上通过装饰器发送信号?

转载 作者:太空狗 更新时间:2023-10-29 21:07:51 26 4
gpt4 key购买 nike

我正在尝试做类似 these proposed signal decorators 的事情.除了具有将装饰方法连接到信号的装饰器(将信号的发送者作为装饰器的参数)之外,我还想在类方法上使用装饰器。

我想像这样使用装饰器:

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 connectAssertionError: Signal receivers must be callable.

我想问题是 @classmethod 返回了一个不可调用的类方法对象。我真的不明白 classmethod 是如何工作的,但我从 this reference page 推测类方法对象在从类中访问之前不会被转换为可调用对象,例如 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 参数来引用该类,但这将允许您保持类似的代码组织。

关于python - Django 在模型方法上通过装饰器发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com