我在一个数据库中有两个表(我已经创建):EntryNation。每次创建新条目时,用户都必须填写与之相关的国家。所以一个条目有两个字段:Content[a charfield]和Nation[a foreign key to a Nation]。问题是,在网站的主页上,最受欢迎的国家按照它们有多少个条目来显示。经常查找Entry表中与每个Nation相关的外键数量似乎效率低下,因此我想知道如何保留一个计数器。我的意思是,如果我为国家创建了一个额外的整数字段,我如何才能使它在每次创建条目时,将正确的国家增加1,并且每次条目被破坏时,将正确的国家减少1。

最佳答案

您可以使用post_save信号,该信号在save()方法结束时发送。
首先,在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)

然后,您可以使用一个简单的查询对Nations进行排序:
Nation.objects.order_by('-counter')

10-04 15:42