如何根据反向关系有效更新计算字段?

时间:2012-06-22 22:22:13

标签: django

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上触发函数,但效率很高。

一个简单的实现方法是连接post_save个实例发出的B信号,然后运行b.a.calculate(),但它会调用a.calculate() N次。

是否有人对如何更有效地实施此建议有任何建议?

我遇到了障碍,因为我不确定如何确定最后一个B实例何时成功更新,之后我希望A实例运行其潜在的昂贵的calculate()函数。

到目前为止,我最好的想法可能是A上的“已更改”标记,并且有一个cron作业,需要更新A个模型,但我希望它更准确。 / p>

1 个答案:

答案 0 :(得分:2)

如果您有一个公式x = a+b+c,那么您总是希望在任何参数a,b或c更改后重新计算x。在上面的模型中,如果模型A中的计算字段值取决于模型B中的关系,那么在其中一个B实例发生更改后,您总是希望重新计算。但是,这并不意味着post_save将运行N次。每次保存一个B实例时,它只会运行一次。

如果B有许多字段不会影响昂贵的A.calculate()函数,那么在B的字段周围添加一个临时校验和,用于计算并将该值存储为新的B字段。然后你的post_save可以重新计算校验和,看看A.calculate()是否需要再次运行。