(作成した)データベースに2つのテーブルがあります:Entry
とNation
。新しいエントリが作成されるたびに、ユーザーはそれが関連する国を入力する必要があります。したがって、エントリにはContent
[charfield]とNation
[Nationへの外部キー]の2つのフィールドがあります。実は、サイトのホームページには、最も人気のある国がエントリー数順に表示されています。Entry
テーブル内のそれぞれに関連する外部キーの数を常に調べるのは非効率的であるように思われるNation
ので、どうすればカウンターを保持できるのか疑問に思います。つまり、Nationsに追加の整数フィールドを作成する場合、エントリが作成されるたびに正しい国が1ずつ増加し、エントリが破棄されるたびに正しい国が減少するようにするにはどうすればよいでしょうか。 1による国。
質問する
67 次
2 に答える
2
集計を使用できます。そうすれば、スキーマは正規化されたままになり、データに一貫性がなくなる可能性がなくなります。あなたの問題はそこに引用されている例の1つと同等のようです。これを試して:
from django.db.models import Count
Nation.objects.annotate(num_entries=Count('entry')).order_by('-num_entries')
于 2012-11-26T01:03:07.230 に答える
2
post_save
メソッドの最後に送信されるシグナルを使用できますsave()
。
まず、(あなたが言ったように)モデルにaを追加counter = IntegerField(default=0)
します。Nation
その後、新しいEntry
ものが作成されるたびに、そのカウンターを増やします。
from django.db.models.signals import post_save
# Your models ...
def increase_nation_counter(instance, created, **kwargs):
if created: # Just increase counter if it's a new Entry
instance.nation.counter += 1
instance.nation.save()
post_save.connect(increase_nation_counter, sender=Entry)
Nation
次に、簡単なクエリでを並べ替えることができます。
Nation.objects.order_by('-counter')
于 2012-11-26T01:09:05.207 に答える