Django 如何有效地更新基于反向关系的计算字段?

Django 如何有效地更新基于反向关系的计算字段?,django,Django,我想保存B的一个实例,使函数在a上启动,但效率很高 一个简单的实现是连接到B实例发出的post\u save信号,然后运行B.A.calculate(),但它会调用A.calculate()N次 有人对如何更有效地实施这一点有什么建议吗 我遇到了一个障碍,因为我不确定如何确定最后一个B实例何时成功更新,之后我希望a实例运行其可能昂贵的calculate()函数 到目前为止,我的最佳想法可能是在a上设置一个“已更改”标志,并让cron作业拾取需要更新的a模型,但我希望它能更准确。如果您有一个公式x

我想保存
B
的一个实例,使函数在
a
上启动,但效率很高

一个简单的实现是连接到
B
实例发出的
post\u save
信号,然后运行
B.A.calculate()
,但它会调用
A.calculate()
N次

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

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


到目前为止,我的最佳想法可能是在
a
上设置一个“已更改”标志,并让cron作业拾取需要更新的
a
模型,但我希望它能更准确。

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


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

创建自定义信号怎么样?A
B
实例如何更新?谢谢您的回答。我喜欢检测相关字段变化的想法。我还喜欢校验和,它可以防止多次保存,而且肯定比实际调用calculate()要快,而不是一开始就比较用于生成计算的参数。我喜欢!
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)