2

(作成した)データベースに2つのテーブルがあります:EntryNation。新しいエントリが作成されるたびに、ユーザーはそれが関連する国を入力する必要があります。したがって、エントリにはContent[charfield]とNation[Nationへの外部キー]の2つのフィールドがあります。実は、サイトのホームページには、最も人気のある国がエントリー数順に表示されています。Entryテーブル内のそれぞれに関連する外部キーの数を常に調べるのは非効率的であるように思われるNationので、どうすればカウンターを保持できるのか疑問に思います。つまり、Nationsに追加の整数フィールドを作成する場合、エントリが作成されるたびに正しい国が1ずつ増加し、エントリが破棄されるたびに正しい国が減少するようにするにはどうすればよいでしょうか。 1による国。

4

2 に答える 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 に答える