如何跟踪连接到对象的外键数量?

时间:2012-11-26 00:52:30

标签: python django

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

2 个答案:

答案 0 :(得分:2)

您可以使用aggregation。这样,您的架构保持规范化,并且您不会有数据不一致的可能性。你的问题似乎等同于那里引用的一个例子。试试这个:

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

答案 1 :(得分:2)

您可以使用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)

然后,您可以使用简单查询对Nation进行排序:

Nation.objects.order_by('-counter')