2015-07-21 89 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

相關問題