class A(models.Model):
def calculate(self):
# calculate some field based on all self.b_set instances
class B(models.Model):
a = models.ForeignKey(A)
我想保存一个B
实例,以使函数在A
上触发,但效率很高。
一个天真的实现是连接到B
实例发出的post_save
信号,然后b.a.calculate()
运行,但它会调用a.calculate()
N 次。
有人对如何更有效地实施这一点有任何建议吗?
我遇到了障碍,因为我不确定如何确定最后一个 B 实例何时成功更新,之后我希望 A 实例运行其可能昂贵的 calculate() 函数。
到目前为止,我最好的想法可能是在A
上"更改"标志,并有一个 cron 作业拾取需要更新A
模型,但我希望它可以更准确。
有一个公式x = a+b+c
那么你总是希望在任何参数a,b或c更改后重新计算x。在上面的模型中,如果模型 A 中的计算字段值取决于模型 B 中的关系,则始终希望在 B 实例之一更改后重新计算。但是,这并不意味着post_save将运行 N 次。每次保存其中一个 B 实例时,它只会运行一次。
昂贵的 A.calculate() 函数,则在 B 的字段周围添加一个临时校验和,这些字段对于计算和存储值作为新的 B 字段很重要。然后,您的post_save可以重新计算校验和,以查看 A.calculate() 是否需要再次运行。