2016-07-25 18 views
3

鑑於這些機型:Django的總量,除以場沒有相關的名稱

class User(models.Model): 
    pass 

class Reward(models.Model): 
    user = models.ForeignKey(User, related_name='+') 

我想獲得一個包含類似一個QuerySet:

| user | reward__count | 
| 1  | 103   | 
| 2  | 50   | 
| 3  | 67   | 

Conventional wisdom建議的查詢看起來像

User.objects\ 
    .annotate(reward__count=Count('reward_set'))\ 
    .values_list('user', 'reward__count') 

不幸的是,因爲相關的名字是+,ne ither reward_setrewards(如果我可以命名它)將作爲Count()的有效參數。鑑於這種情況,除了python for循環來獲取所需的QuerySet真的沒有辦法嗎?

for user in User.objects.all(): 
    user_rewards = Reward.objects.filter(user=user).count() 
    # Store (user.pk, user_rewards) somewhere. 
+0

那麼,爲什麼你不讓它設置一個相關的名字呢? –

+0

@DanielRoseman如果他們是圖書館的一部分(而不是你在github上發現的髖關節類型,但是沒有人敢觸及的半內部類型),你會怎麼做? – Brian

回答

5

我想獲得一個包含類似一個QuerySet:

| user | reward__count | 
| 1  | 103   | 
| 2  | 50   | 
| 3  | 67   | 

這個你可以做,通過在Reward對象使用aggregations

# Fetch a list of rewards, grouped by 
rewards = Reward.objects.values('user').annotate(Count('id')).order_by() 

這會給你一個這樣的列表:

[ 
    {'user': 1, 'id__count': 103}, 
    {'user': 2, 'id__count': 50}, 
    {'user': 3, 'id__count': 67}, 
    ... 
] 

其中user是用戶ID,id__count是與該用戶關聯的獎勵數量。

+0

好主意。你怎麼看我的? (隱藏在我的文檔頁面的鏈接中) – e4c5

+1

聰明(和合法)使用values()!非常感謝你們兩位。 – Brian

4

@solarissmoke發佈了一個很好的答案,我upvoted,我想提出一個替代?一個unmanaged model

創建一個非託管模型,指向與不可觸摸庫應用程序中相同的表。

class RewardOnSteroids(models.Model): 
    user = models.ForeignKey(User, related_name='pick something') 

    class Meta: 
     managed = False 
     db_table = 'original table name' 
+0

就文檔而言,[這裏是鏈接到Django文檔](https://docs.djangoproject.com/en/1.9/ref/models/options/#django.db.models.Options.managed)。 (我仍然不相信SO文件......) – solarissmoke