如何跟踪有多少外键连接到一个对象?

2024-05-19 23:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: tokey用户目的数据库顺序网站条目
2条回答

你可以用aggregation。这样,您的模式保持规范化,并且您的数据不存在不一致的可能性。你的问题似乎相当于这里引用的一个例子。试试这个:

from django.db.models import Count
Nation.objects.annotate(num_entries=Count('entry')).order_by('-num_entries')

您可以使用^{}信号,它在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)

然后,您可以通过一个简单的查询对Nation进行排序:

Nation.objects.order_by('-counter')

相关问题 更多 >