2010-09-28 137 views
1

我已經得到的模型是這樣的堆棧快速計數(我在相對速記打字出來):與聯Django模型

class User: 
    pass 


class ItemList: 
    pass 


# A User can have more than one ItemList 
# An ItemList can have more than one User 
# Classic M2M 

class ItemListOwnership: 
    user = fk(User) 
    itemlist = fk(ItemList) 


# An ItemList has multiple Items 

class Item: 
    itemlist = fk(ItemList) 

我想要做的是顯示的簡單計數給定用戶(或用戶的現有查詢集)在其各個列表上有多少項目。 我需要計算整個M2M的差距。

這就是我卡住的地方。我很滿意純粹的SQL方法,如果這是唯一的作品,但我真的不想進入我發佈n + 1每個用戶查詢的情況(其中n是列表數a用戶)僅僅是一個個性化......

編輯:我不使用一個「真正的」 models.ManyToMany(..)的關係,因爲我在ItemListOwnership描述的關係稍微好一點的定義其它的東西。如果它是一個殺手,我也許可以移動到其他位置元數據,並擺脫ItemListOwnershipItemList

回答

3

首先,在一個鏈接表定義額外的字段是什麼ManyToManyFieldthrough功能是堅持一個M2M。因此,請將您的ItemListOwnership表與其FK保持一致,但請將userlist=ManyToMany('User', through='ItemListOwnership')添加到UserList

一旦你做到了這一點,你可以很容易地通過使用註釋數項針對每個用戶的數量:

from django.db.models import Count 
User.objects.all().annotate(item_count=Count('userlist__item')) 

現在,每個用戶都有一個item_count屬性,是他們擁有的項目數量。