2017-02-28 12 views
0

2つのモデルがあります。そのうちの1つは、他のモデルのデータを使用して独自のフィールドを設定します。問題は、最初のモデルが更新されたときに、2番目のモデルがそれ自身のフィールドも更新しないということです。私は行かなければならず、実際にフィールドを更新するために2番目のモデルを編集/保存する必要があります。Django - 別のモデルのフィールドをリフレッシュするために信号を使用する

このような何か:

models.py:

class ModelA(models.ModelForm) 
    ... 

class ModelB(models.ModelForm) 
    count_number_of_model_A = models.IntegerField 
    def save(self) 
     self.count_number_of_model_A = ModelA.objects.all().count() 
     super(ModelB, self).save() 

(これは私が何をしようとしているの簡易版である)

今私は、フィールド "count_number_of_model_A" をしたいですモデルBが更新され、ModelAが変更されるたびに更新されます。現時点では、ModelBを実際に変更して保存した場合にのみリフレッシュされます。

私は答えが信号(多分?)を使用することだと思います。 ModelAで新しいオブジェクトが作成されるたびに、ModelBが更新されるように信号を設定しようとしています。私は、それらの変更が反映されているModelB.objects.filter(一部のフィルタ).update(いくつかのフィールド)のようなものに入れているかのように私は行くとするとき、信号は、適切に機能している

@receiver(post_save, sender=ModelA) 
def update_sends(sender, **kwargs): 
    if kwargs.get('created', False): 
     #some code here to refresh ModelB?? 

:私は以下の持っています新しいModelAオブジェクトを作成します。しかし、モデル全体が更新されず、私が後にしている( "count_number_of_model_A")問題のフィールドは更新されません。

助けが必要ですか?

答えて

1

だけ使用します。

for model_b in ModelB.objects.filter(<some_filter>): 
    model_b.save() 

をしかし、あなたは、これは(フィルタリング)すべてを引っ張ることに注意する必要がありますが、それらに何かをしてデータベースに戻って保存し、ジャンゴに反対します。これはquery expressionsを使用するよりもずっと遅いです。設定するにはもう少し作業が必要ですが、特にデータベースが大きくなった場合には非常に高速に動作します。

+0

これは素晴らしい機能でした!ありがとう!私のDBはかなり小さいので、私はそれが遅くなるのを心配していませんが、私はそれを切り替えようとします。ご協力いただきありがとうございます! – Josh

関連する問題