2011-08-09 14 views
8

मुझे आश्चर्य है कि यह प्रश्न स्पष्ट रूप से अस्तित्व में नहीं है। यदि ऐसा होता है, तो कृपया इसे ढूंढने में मेरी सहायता करें।Django सशर्त एनोटेशन

मैं एनोटेट (गणना) और order_by का उपयोग करना चाहता हूं, लेकिन मैं किसी संबंधित ऑब्जेक्ट के प्रत्येक इंस्टेंस को गिनना नहीं चाहता, केवल एक निश्चित मानदंड को पूरा करता हूं।

बुद्धि के लिए, कि मैं हरे नारियल की संख्या से स्वैलोज़ सूची हो सकता है वे किया है:

swallow.objects.annotate(num_coconuts=Count('coconuts_carried__husk__color = "green"').order_by('num_coconuts') 

उत्तर

8

यह सही तरीके से होना चाहिए।

swallow.objects.filter(
    coconuts_carried__husk__color="green" 
).annotate(
    num_coconuts=Count('coconuts_carried') 
).order_by('num_coconuts') 

नोट जब आप एक संबंधित क्षेत्र के लिए फ़िल्टर, कच्चे एसक्यूएल में इसकी अनुवाद है कि एक बायाँ शामिल हों के साथ साथ एक कहां के रूप में। अंत में एनोटेशन परिणाम सेट पर कार्य करेगा, जिसमें केवल संबंधित पंक्तियां शामिल हैं जिन्हें पहले फ़िल्टर से चुना जाता है।

+0

दरअसल यह काम प्रतीत होता है, लेकिन आप का कहना कारणों के लिए, यह पूरी तरह से जवाबी सहज है। मैं इस क्वेरीसेट से मुझे उन सभी निगलने की उम्मीद करूंगा जो कभी भी कम से कम एक हरे नारियल लेते हैं, जो कि रंग के बावजूद नारियल की कुल संख्या द्वारा आदेश दिया जाता है। – jMyles

+1

@jMyles: दस्तावेज बताता है कि यह [एनोटेट और फ़िल्टर क्लॉज के क्रम] पर निर्भर करता है (https://docs.djangoproject.com/en/1.3/topics/db/aggregation/#order-of-annotate- और-फ़िल्टर-क्लॉज) - दूसरे तरीके से, जैसा कि आप वर्णन करते हैं, यह व्यवहार करेगा। –

+2

क्या होगा यदि आप निगलने को शामिल करना चाहते हैं जिसने कोई हरा नारियल नहीं लिया है? –

3

Django> = 1.8 के लिए:

from django.db.models import Sum, Case, When, IntegerField 

swallow.objects.annotate(
    num_coconuts=Sum(Case(
     When(coconuts_carried__husk__color="green", then=1), 
     output_field=IntegerField(), 
    )) 
).order_by('num_coconuts') 
संबंधित मुद्दे