2012-10-30 15 views
32

मैं दो मॉडल इस तरह हल्के ढंग से परिभाषित किया है साथ गिनती व्याख्या:Django एक विशिष्ट क्षेत्र के

class InformationUnit(models.Model): 
    username = models.CharField(max_length=255) 
    project = models.ForeignKey('Project') 
    ... 

class Project(models.Model): 
name = models.CharField(max_length=255) 

अब, एक दृश्य में, मैं सभी InformationUnits कि एक परियोजना के हैं व्याख्या करना चाहते हैं, तो मैं ऐसा करते हैं:

p = Project.objects.all().annotate(Count('informationunit') 

जो सिर्फ ठीक इसके अलावा, मैं जानना चाहता हूँ काम करता है, प्रत्येक परियोजना, कितने अलग 'उपयोगकर्ता नाम' भाग लेने में। यह है कि, एक परियोजना लिखें जो सूचनाUnits में कितने विशिष्ट 'उपयोगकर्ता नाम' हैं। मैं निम्नलिखित की कोशिश की है, लेकिन यह केवल उपयोगकर्ता नाम की परवाह किए बिना, InformationUnit की संख्या की गणना:

p = Project.objects.all().annotate(Count('informationunit__username') 

ध्यान दें कि उपयोगकर्ता नाम एक वस्तु नहीं है, यह एक श्रृंखला है। क्या ऐसा करने का कोई साफ तरीका है या क्या मुझे लूप और स्पेगेटी कोड के आधार पर एक और जटिल कोड बनाना चाहिए: पी

बहुत बहुत धन्यवाद!

उत्तर

54

Count तो जैसे एक distinct तर्क ले जा सकते हैं,:

p = Project.objects.all().annotate(Count('informationunit__username', 
             distinct=True)) 

यह प्रलेखित किया जाना प्रतीत नहीं होता है, लेकिन आप गणना के लिए स्रोत में पा सकते हैं।

+0

के साथ इस काम की पुष्टि कर सकता है यह काम करता है! मुझे यह कहीं और मिला और यहां तक ​​कि कोशिश की गई (वास्तव में यह सवाल पूछने से पहले मैंने आखिरी चीज की थी)। शुरुआत में यह काम नहीं किया, लेकिन विकास सर्वर को पुनरारंभ करने के बाद आज फिर से कोशिश की और यह चाल है: पी बहुत बहुत धन्यवाद! – fenomenoxp

+0

यह दस्तावेज है (अब, वैसे भी): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Count.distinct –

6
Project.objects.all().annotate(Count('informationunit__username', 
            distinct=True)) 
+0

, परियोजना का एक क्षेत्र होने के लिए उपयोगकर्ता नाम नहीं करना चाहिए? – fenomenoxp

+0

इसे आजमाया, लेकिन यह विफल हो गया क्योंकि उपयोगकर्ता नाम – fenomenoxp

+0

का क्षेत्र नहीं है django 1.7 – rix

6

तुम सिर्फ अलग-अलग मान की गणना करना चाहते हैं, तो आप अलग() का उपयोग करें और (गिनती) कार्य कर सकते हैं:

count = Project.objects.values('informationunit__username').distinct().count() 
है कि काम करने के लिए के लिए
+0

धन्यवाद, मैं यही देख रहा था के लिये। स्वीकार्य उत्तर वस्तुओं की एक सूची देता है। आपका समाधान मेरे लिए काम किया। – allardbrain

संबंधित मुद्दे