2012-01-05 13 views
11

यह एक बहुत ही बेवकूफ बात है, मुझे पता है, लेकिन मुझे लगता है कि Django कुल और एनोटेट फ़ंक्शंस पर हैंडल नहीं लगता है।django कुल या एनोटेट

मेरे पास मॉडल का एक बहुत ही सरल सेट है: Events, Areas और Types। एक कार्यक्रम में Area और Type पर इंगित करने वाली विदेशी कुंजी होती है। मैं बस किसी भी क्षेत्र के लिए आने वाली घटनाओं की संख्या और किसी भी प्रकार के लिए, जैसे क्षेत्र 1 - 5 आगामी घटनाओं, क्षेत्र 2 - 6, या टाइप 1 - 34 ईवेंट और इसी तरह।

मैं कस्टम एसक्यूएल लिखने से बचाना चाहता हूं, और यदि संभव हो तो क्यू ऑपरेटर।

+0

क्या आपने [प्रलेखन] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/) पढ़ा है और वास्तव में कुछ उदाहरणों को लागू करने का प्रयास किया है? –

+1

कृपया अपना कोड दिखाएं, इसलिए हम आपको एक ठोस समस्या के साथ मदद कर सकते हैं। – Marcin

उत्तर

10
एक दिए गए क्षेत्र के लिए

:

my_area = Area.objects.all()[0] 
Event.objects.filter(area=my_area).count() 

एनोटेशन

events = Event.objects.annotate(Count('area')) 
for event in events: 
    print event, event.area__count 

निम्नलिखित डॉक्स देखें:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate

+0

आपको बहुत धन्यवाद, c4yourself और Daniel Roseman। – freethrow

10

तुम सिर्फ एक ही क्षेत्र के लिए ईवेंट की कुल संख्या की जरूरत है, आप या तो annotate या aggregate, एक सरल count करना होगा की जरूरत नहीं है:

Event.objects.filter(area=my_area).count() 

आप एक से अधिक के लिए घटनाओं की गिनती चाहते हैं क्षेत्रों, आप values साथ संयोजन के रूप में annotate की जरूरत है:

Event.objects.values('area').annotate(Count('area')) 
0

आप सभी बहुत बहुत धन्यवाद। मुझे जो समस्या हो रही थी वह पिछले संस्करण में प्रलेखित है, यह एनोटेट और फिल्टर प्राथमिकता के बारे में है।

areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event')) 

मेरी त्रुटि इस तथ्य में थी कि मैं पहले एनोटेट कर रहा था और दूसरा फ़िल्टर कर रहा था।

+0

उन लोगों के लिए जो दस्तावेज़ों में इसकी तलाश में हैं ... [एनोटेट और फ़िल्टर क्लॉज का ऑर्डर] (https://docs.djangoproject.com/en/stable/topics/db/aggregation/#order-of-annotate-and- फिल्टर-खंड) – alxs

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