2012-09-21 25 views
5

唯一值具有以下型號:Django的ORM和hstore:計數的關鍵

from django_hstore import hstore 
from django.db import models 

class Item(VoteModel): 
    data = hstore.DictionaryField(db_index=True) 
    objects = hstore.HStoreManager() 

喜歡的東西:

Item.objects.extra(select={"key": "content_item.data -> 'key'"}).aggregate(Count('key')) 

不起作用,參見Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query?https://code.djangoproject.com/ticket/11671

原始SQL其中工程如下:

SELECT content_item.data -> 'key' AS key, count(*) FROM content_item GROUP BY key;                    
    key  | count 
-----------+------- 
value1 | 223 
value2 | 28 
value3 | 31 
(3 rows) 

我如何通過Django的ORM興田得到同樣的結果?

FYI:

Item.objects.extra(select={"key": "content_item.data -> 'key'"}) 

翻譯爲:

SELECT (content_item.data -> 'key') AS "key", "content_item"."id", "content_item"."data" FROM "content_item" 

回答

7

您是否嘗試過與價值觀和ORDER_BY?

Item.objects.extra(
    select=dict(key = "content_item.data -> 'key'") 
).values('key').order_by('key').annotate(total=Count('key')) 

這樣的東西適用於PostgreSQL和Django 1.4中的我。

+1

阿哈,聰明,非常感謝!我知道我可以用'values('key')'獲得一個列表,但是也沒有試圖使用'aggregate'。我將不得不花費更多的時間來完全理解這些ORM抽象如何工作:) –

+0

@MaximeR:由於ORM的「管理」應用程序依賴性,我不得不吞下它,但恕我直言,ORM是最弱的組件Django框架。我夢想有人用Flask,SQLAlchemy和Jinja2克隆Django管理員應用程序。 –

+0

@AlexK:對我來說''django.contrib.admin'是一個殺手級的應用程序(不是Django本身),我應該騰出一些時間,讓一個克隆與任何特定的ORM解耦。 –