我在一个数据库中有两个表(我已经创建):Entry
和Nation
。每次创建新条目时,用户都必须填写与之相关的国家。所以一个条目有两个字段: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)
然后,您可以使用一个简单的查询对
Nation
s进行排序:Nation.objects.order_by('-counter')