2

我在数据库中有两个表(我已经创建):EntryNation​​. 每次创建新条目时,用户都必须填写与之相关的国家。所以一个条目有两个字段:Content[a charfield] 和Nation[a foreign key to a Nation]。问题是,在网站的主页上,最受欢迎的国家是按照他们有多少条目的顺序显示的。不断查找Entry表中与每个相关的外键数量似乎效率低下Nation,所以我想知道如何保留一个计数器。我的意思是,如果我为国家创建一个额外的整数字段,我怎么能做到这样每次创建一个条目时,它会将正确的国家加 1,而每次销毁一个条目时,它会减少正确的国家国家1。

4

2 回答 2

2

您可以使用聚合。这样,您的模式将保持规范化,并且您的数据不会出现不一致的情况。您的问题似乎等同于那里引用的示例之一。尝试这个:

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使用简单的查询对您的 s 进行排序:

Nation.objects.order_by('-counter')
于 2012-11-26T01:09:05.207 回答