2
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发出的信号然后运行,但它会调用N 次。Bb.a.calculate()a.calculate()

有人对如何更有效地实施这一点有任何建议吗?

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

到目前为止,我最好的想法可能是打开一个“已更改”的标志,A并让一个 cron 工作来确定哪些A模型需要更新,但我希望它可以更准确。

4

1 回答 1

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

于 2012-06-23T18:21:58.253 回答