2015-07-21 97 views
1

我有以下领域的用户模型..标注在同一模型给人意想不到的结果

class User(models.Model): 
    user_id = models.CharField(max_length=40,unique=True) 
    user_name = models.CharField(max_length=40) 
    user_email = models.EmailField() 
    user_city = models.CharField(max_length=40) 
    class Meta: 
     ordering = ['user_id'] 
     verbose_name = 'User MetaData' 
     verbose_name_plural = 'Users MetaData' 
    def __unicode__(self): 
     return self.user_id 

现在我想筛选前10个城市的前10个城市在城市用户数的用户即列表。我用下面的语法,但始终我得到city_count = 1 ..

User.objects.annotate(city_count=models.Count('user_city')) .order_by('-city_count'))[:10] 

我也尝试下面的语法,但相同的结果...

User.objects.values('user_city').annotate(city_count=models.Count('user_id')) .order_by('-city_count'))[:10] 

我哪里做错了?

+1

请问,如果你使用第二个语法,但算的,而不是 'USER_ID' user_city“工作? –

+0

如果您以@DanielRoseman建议的方式将'user_id'替换为'user_city',那么您的最后一个示例工作正常。 – f43d65

+0

@DanielRoseman我试过,但没有工作.. – Naresh

回答

1

你的第二个例子是正确的,只是修正错别字。更换

User.objects.values('user_city').annotate(city_count=models.Count('user_id')) .order_by('-city_count'))[:10] 

User.objects.values('user_city').annotate(city_count=models.Count('user_city')).order_by('-city_count')[:10] 

更新1,2:

top_cities_queryset = (User.objects 
         .values('user_city') 
         .annotate(user_city_count=models.Count('user_city')) 
         .order_by('-user_city_count') 
         .values_list('user_city', 'user_city_count')) 

top_cities = [{city: count} for city, count in top_cities_queryset] 
+0

这是工作,但我总是得到10个用户在一个城市的结果....但我想根据该城市的用户数量的前10名城市列表。 – Naresh

+0

我的不好。你的问题很清楚。查看更新。 – f43d65

+0

仍然同样的结果...获得城市用户的详细信息....意味着根据城市的字母顺序短路用户.....首先,我得到所有用户在纽约市名单.....但城市在这里字母顺序,即从'A'开始。我想要像[{new york:20},{sydney:15}]这样的不同结果......我们可以聊聊天吗... – Naresh

2

如果没有与User有关系的模型,我认为您不能这样做。基本上你需要在另一个模型上运行查询,然后从其他模型中注释user_city。这对你的具体情况有点奇怪。

但是,你可以在Python中做到这一点。下面是我该怎么做:

from collections import Counter 
city_counter = Counter(User.objects.values_list('user_city', flat=True)) 
top_ten_cities_and_counts = city_counter.most_common()[:10] 
top_ten_cities = [city for city, count in top_ten_cities_and_counts] 
+0

下面是我的模型的完整墨水....实际上我使用多对多关系..http://stackoverflow.com/questions/31538188/annotate-many- django – Naresh

相关问题