2012-09-21 24 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')) 

काम नहीं करता है, cf Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query? और https://code.djangoproject.com/ticket/11671

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 के माध्यम से hte एक ही परिणाम प्राप्त कर सकते हैं:

कच्चे एसक्यूएल जो काम करता है निम्नलिखित है?

FYI करें:

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

उत्तर

7

आप मूल्यों और order_by के साथ की कोशिश की है:

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

करने के लिए अनुवाद?

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

पोस्टग्रेएसक्यूएल और डीजेगो 1.4 में मेरे लिए यह कुछ काम करता है।

+1

आहा, चालाक, बहुत बहुत धन्यवाद! मुझे पता था कि मैं 'मूल्यों (' कुंजी ') के साथ एक सूची प्राप्त कर सकता हूं लेकिन उस पर' कुल 'का उपयोग करने में भी असफल रहा। मुझे यह समझने के लिए कुछ और समय बिताना होगा कि उन ओआरएम एस्ट्रस्ट्रक्शन कैसे काम करते हैं :) –

+0

@ मैक्सिमआर .: ओआरएम पर "व्यवस्थापक" ऐप निर्भरता के कारण मुझे इसे निगलना है, लेकिन आईएमएम ओआरएम में सबसे कमजोर घटक है Django ढांचे। मैं Flask, SQLAlchemy और Jinja2 का उपयोग कर Django व्यवस्थापक एप क्लोनिंग किसी के साथ सपना देखता हूं। –

+0

@AlexK: मेरे लिए 'django.contrib.admin' एक हत्यारा ऐप है (Django खुद नहीं), मुझे कुछ समय छोड़ना चाहिए और किसी विशिष्ट ओआरएम से क्लोन को डीकॉप्ल करना चाहिए। –