0

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

报价的价格取决于数十个子(和孙子)对象。最低的是费率/小时。

当我更改报价的子对象(例如费率/小时)时,报价价格会发生变化。

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

我不确定如何做到这一点,我应该使用信号吗?鹡鸰钩?

4

1 回答 1

1

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

所有的孩子(和孙子)都是同一个模型吗?在这种情况下,您可以只在子模型上注册一个 post_save 信号,但一般来说,我建议您仅将 post_save 用于非变异操作,例如在对象更改时发送电子邮件,除非您考虑以下事项:

  • 这种处理会很快变得非常缓慢。如果您有多个报价,则需要使用原子事务,否则在保存每个报价时都会建立新的数据库连接。
  • 您还需要预取子和孙以防止多个数据库调用。
  • 在 post_save 中保存其他模型时,您会冒着创建无限循环 post_save 信号的风险。

我认为更好的方法是添加一个调用price报价的@property,而不是将价格存储在数据库中:

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

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

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

于 2021-12-14T11:04:03.697 回答