如何保持基于反向关系的计算字段高效更新


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 实例时,它只会运行一次。

如果 B 有许多字段不会影响

昂贵的 A.calculate() 函数,则在 B 的字段周围添加一个临时校验和,这些字段对于计算和存储值作为新的 B 字段很重要。然后,您的post_save可以重新计算校验和,以查看 A.calculate() 是否需要再次运行。

最新更新