【问题标题】:Can Django pre_save signal work for all derived classesDjango pre_save 信号是否适用于所有派生类
【发布时间】:2010-08-07 18:52:47
【问题描述】:

我有一个模型类“Action”,它被其他几个类扩展。我是 django 的新手,并假设如果我调用 pre_save.connect(actionFunc, sender=Action),那么只要调用 Action 类中的 save 方法(包括任何派生类),actionFunc 就会被调用。

我的观察是,只有当实例与 Sender 中定义的 Class 类型直接匹配时才会触发此函数。有没有办法让它也接收所有派生的 Action 实例的信号?

【问题讨论】:

标签: django django-signals


【解决方案1】:

不,您必须多次拨打pre_save.connect

但是,您可以使用 python 获取扩展您感兴趣的类的所有类,并循环 pre_save 连接语句。

假设Action 的扩展类都在给定文件中,您可以执行以下操作:

global_dict = globals().copy()
[el for el in global_dict.values() if getattr(el,'__base__',None)==Action]

【讨论】:

  • 可以连接一次而不指定发送者,而不是多次连接,并在接收者函数中检查发送者 issubclass()
【解决方案2】:

您可以做的一件事是在 django 中修改信号发送器,这样它就不会匹配特定类型了

if isinstance(sender, filter):
    send_signal()

(伪代码)

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2011-12-22
    • 2013-12-28
    • 2011-09-03
    • 1970-01-01
    • 2014-04-15
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多