Django:每当从 wagtail 界面修改某些对象时如何触发函数

Django: How to trigger a function whenever certain objects are modified from the wagtail interface

我有一长串“报价单”对象。

一个报价的价格取决于几十个子(孙)物件。最低的是 rate/hour.

当我更改 rate/hour 等报价的子对象时,报价会发生变化。

我想自动重新计算受我对其一致对象所做的任何更改影响的每个报价单的价格。我正在为对象管理员使用 Wagtail。

我不确定该怎么做,我应该使用信号吗?鹡鸰钩?

Wagtail 模型和页面只是 Django 模型。

所有children(和grand children)都是同一个型号吗?在那种情况下,您可以在 child 模型上注册一个 post_save 信号,但一般来说,我建议仅将 post_save 用于 non-mutating 操作,例如发送电子邮件时object 变化,除非您考虑以下因素:

  • 这种处理很快就会变得非常慢。如果你有多个引用,你需要使用一个 ,否则你将在保存每个引用时建立一个新的数据库连接。
  • 您还需要 prefetch children 和 grandchildren 以防止多次数据库调用。
  • 在 post_save 中保存其他模型时,您 运行 存在创建 post_save 信号无限循环的风险。

我认为更好的方法是在报价单上添加一个名为 price 的 @属性,而不是将价格存储在数据库中:

class Quotation(models.Model):
    # Model fields here
    ...

    @property
    def price(self):
        return sum([child.price for child in self.children])

这只会在您调用 quotation.price 时计算价格。您可以通过在接收报价时预取 children 来加快此计算。