2009-11-26 307 views
2

我有一個名爲Item的模型,與用戶(「所有者」)具有m2m關係。django聚合聚合字段?

對於每一個項目,我需要算誰擁有它的用戶。這是與註釋()

很容易但後來我需要計算具體的性別和總所有者的所有者之間的比例計算每個項目。例如,如果2個男性擁有5個用戶中的項目,則配給量爲0.4。

這樣做的最佳方法是什麼?

回答

3

要使用ORM做到這一點,你需要有條件的聚集,這是不是在Django支持。 http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django提出了一個可能工作的hacky解決方案。

如果您不需要通過率進行排序,那麼你可以讓兩個電話來註釋,然後計算在Python中的比例。喜歡的東西:

items = Item.objects.annotate(ucount=Count('users')).annotate(ccount=CountIf(<condition>)) 
for item in items: 
    item.ratio = item.ucount/item.ccount 

如果你不想這樣做,我會建議使用額外的()方法和一些自定義的SQL得到你想要的額外的信息。該方法的文檔位於Django Queryset API文檔頁面上。

0

只是在我的頭頂,像下面這樣可以工作。迭代就可以了,如果你希望得到您的完美解決方案:

items = Item.objects.annotate(Count('users')) 

for item in items: 
    total = item.users__count 
    num_males = item.users.filter(gender='M').count() 
    num_females = item.users.filter(gender='F').count() 
+0

我想到的是第一,但它是在DB這麼重來電:/ – 2009-11-27 14:43:37

+0

如果以上可以以純SQL與數據庫比要求少做以上,然後用原始SQL或張貼在這裏,這樣的人可以找到相當於QuerySet。 – 2009-11-27 15:44:02