【问题标题】:Django: How to trigger a function whenever certain objects are modified from the wagtail interfaceDjango:每当从 wagtail 接口修改某些对象时如何触发函数
【发布时间】:2022-01-17 15:44:00
【问题描述】:
我有一长串“报价”对象。
报价的价格取决于数十个子(和孙子)对象。最低的是费率/小时。
当我更改报价的子对象(例如费率/小时)时,报价价格会发生变化。
我想自动重新计算受我对其一致对象所做的任何更改影响的每个报价的价格。我正在使用 Wagtail 作为对象管理员。
我不确定如何做到这一点,我应该使用信号吗?鹡鸰鱼钩?
【问题讨论】:
标签:
django
triggers
wagtail
django-signals
wagtail-admin
【解决方案1】:
Wagtail 模型和页面只是 Django 模型。
所有的孩子(和孙子)都是同一个模型吗?在这种情况下,您可以只在子模型上注册一个 post_save 信号,但一般来说,我建议您仅将 post_save 用于非变异操作,例如在对象更改时发送电子邮件,除非您考虑以下事项:
- 这种处理会很快变得非常缓慢。如果您有多个引用,则需要使用atomic transaction,否则您将在保存每个引用时建立新的数据库连接。
- 您还需要prefetchchildren 和孙子,以防止多次数据库调用。
- 在 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 时计算价格。您可以通过在接收报价时预取子项来加快计算速度。