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>
答案 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()是否需要再次运行。