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