2012-11-26 38 views
2

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

您可以使用aggregation。这样,您的模式保持正常化,并且您不会有数据不一致的可能性。你的问题似乎与其中引用的例子之一相同。试试这个:

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