2012-08-06 13 views
9

यहाँ मेरी डेटाबेस क्वेरी है:Django: का प्रयोग व्याख्या करते हैं, गणना और एक क्वेरीसमूह पर अलग

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 

क्वेरी नीचे के रूप में टूट इस प्रकार है (मैं इसे समझने के रूप में):

  • पहले फिल्टर वर्तमान संलग्नक है जो "वर्तमान" हैं।
  • फिर किसी निश्चित 'article_id' के साथ उन अनुलग्नकों की संख्या को गिनने के लिए।
  • फिर प्रत्येक अटैचमेंट को अटैचमेंट की संख्या के साथ एनोटेट करने के लिए जिसमें आलेख_आईडी सामान्य है।
  • फिर अनुलग्नकों की संख्या के आधार पर रैंक करने के लिए।
  • फिर, सूची को अलग से अलग करना, ताकि प्रत्येक आलेख_आईडी मान के लिए एक अटैचमेंट ऑब्जेक्ट हो।

मैं इसे पोस्टग्रेएसक्यूएल पर चला रहा हूं, इसलिए Django docs के अनुसार, मैं एक फ़ील्ड के आधार पर अलग() चलाने के लिए ठीक हूं।

कोई त्रुटि जब मैं क्वेरी निष्पादित है, लेकिन जब मैं पुनरावृति या यहाँ तक कि परिणाम निम्न त्रुटि Django डिबग से फेंक दिया जाता है मुद्रित करने के लिए प्रयास करें:

NotImplementedError at /function/ 
annotate() + distinct(fields) not implemented. 

इंटरैक्टिव शीघ्र से अधिक विस्तृत ट्रैस है :

File "<console>", line 1, in <module> 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 118, in _result_iter 
    self._fill_cache() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 875, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in execute_sql 
    sql, params = self.as_sql() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 107, in as_sql 
    "annotate() + distinct(fields) not implemented.") 
NotImplementedError: annotate() + distinct(fields) not implemented. 

कोई भी जानता है कि यहां क्या हो रहा है?

+2

सुंदर सीधे आगे लगता है। 'NotImplementedError' एक Django अपवाद है। यह कोड आपको यह बताने के लिए उठा रहा है कि आप इस समय 'एनोटेट' और 'विशिष्ट' (फ़ील्ड के साथ) को एक साथ जोड़ नहीं सकते हैं, जिसका अर्थ है कि यह अभी काम नहीं करता है। भविष्य में वे जो भी समस्याएं शामिल कर सकते हैं, वे काम कर सकते हैं, लेकिन अभी के लिए आप भाग्य से बाहर हैं। आप हमेशा 'कच्चे' का सहारा ले सकते हैं और जो भी चाहें कर सकते हैं। –

+0

उपरोक्त कोड उदाहरण में आप एक डॉट खो रहे हैं "।" order_by और विशिष्ट फ़ील्ड के बीच। – Mikael

+0

@Chris एक ही चीज़ को पूरा करने के लिए वैकल्पिक प्रश्न (कच्चे एसक्यूएल के अलावा) पर कोई विचार? – Pat

उत्तर

5

कार्य-आसपास values('distinct_fieldname') का उपयोग करना है क्योंकि इससे अंतिम SQL कथन उस क्षेत्र पर GROUP BY निष्पादित करेगा (आप एक से अधिक फ़ील्डनाम जोड़ सकते हैं), जो अनिवार्य रूप से वही है।

उदाहरण के लिए

, अगर आप को पता है कितने लेख एक दिया 'filename' आप इस करना होगा के लिए मौजूद हैं:

results = Attachments.objects.filter(currency='current').values('filename').annotate(num_attachments=Count('article_id')).order_by("num_attachments") 
संबंधित मुद्दे