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によって発行されたシグナルに接続してから run を実行しますが、 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 インスタンスの 1 つが変更された後に常に再計算する必要があります。ただし、それは必ずしも post_save が N 回実行されることを意味するわけではありません。B インスタンスの 1 つが保存されるたびに 1 回だけ実行されます。

B に、高価な A.calculate() 関数に影響を与えない多くのフィールドがある場合、計算に重要な B のフィールドの周りに一時的なチェックサムを追加し、値を新しい B フィールドとして保存します。その後、post_save はチェックサムを再計算して、A.calculate() を再度実行する必要があるかどうかを確認できます。

于 2012-06-23T18:21:58.253 に答える