2011-10-31 14 views
7

Django एनोटेशन औसत, न्यूनतम/अधिकतम, आदि के लिए बहुत अच्छा है। यह भी गणना करता है। तो क्या यह वही SQL उत्पन्न करता है जैसे कि मैंने क्वेरीसेट पर पुराने .count() का उपयोग किया था? या यह कुछ मामलों में एसक्यूएल अधिक कुशल एसक्यूएल उत्पन्न करता है? या बदतर एसक्यूएल?django में, कुल (गणना()) किसी भी तरह से .count() से तेज़ या बेहतर है?

क्षमा करें, स्पष्ट करने के लिए, मेरा मतलब गिनती() ऑपरेशन की तुलना समग्र (गणना (आईडी ')) के साथ करना है जहां आईडी तालिका का पीके है।

तो इसके साथ, मेरा मानना ​​है कि ब्रायन का सही जवाब है। संक्षेप में, गिनती() कुल योग का एक विशेष मामला है()।

उत्तर

8

क्वेरीसमूह के .count() विधि कॉलिंग अंततः Count() कहता है।

विशेष रूप से: django.db.models.QuerySet.count() कॉल django.db.models.sql.Query.get_count(), जो django.db.models.sql.Query.add_count_column(), जो क्वेरी के लिए django.db.models.sql.aggregates.Count कहते हैं कहते हैं।

दोनों के बीच मुख्य अंतर यह है कि जब आप Count सीधे उपयोग करते हैं, आप क्षेत्रों आप गिनती करने के लिए है, जबकि जब आप क्वेरीसमूह पर .count() कहते हैं, इस SELECT COUNT(*)... में (सिवाय जब तुम भी विशिष्ट का उपयोग परिणाम होगा निर्दिष्ट है() या जब आप चयनित खंड में फ़ील्ड को सीमित करते हैं, तो इस मामले में यह अधिक जटिल होता है)।

1

सेब और संतरे। .count() वर्तमान क्वेरीसेट पर एक एसक्यूएल गिनती करता है। Count कुल मिलाकर, क्वेरीसेट पर निर्दिष्ट रिश्तों पर एक गिनती चलाता है।

Pizza.objects.count() # Total amount of pizzas 

Pizza.objects.aggregate(topping_count=Count('toppings')) # Total amount of toppings associated to a pizza 

Pizza.objects.annotate(topping_count=Count('toppings')) # Total amount of toppings on each pizza 
+0

माना जाता है कि पिज्जा और टॉपिंग में एम 2 एम रिश्ते है, पिज्जा पर कुल कॉलिंग आपकी दूसरी पंक्ति में प्रत्येक पिज्जा के लिए टॉपिंग की कुल संख्या वापस नहीं करेगा; यह पिज्जा से टॉपिंग में शामिल हो जाएगा और मूल रूप से जुड़ने की संख्या की गणना करेगा। प्रत्येक पिज्जा के लिए टॉपिंग की संख्या प्राप्त करने के लिए आपको aggreate() के बजाय एनोटेट() का उपयोग करने की आवश्यकता है। –

+0

क्षमा करें। मैं अपने विवरण पर बंद था जो कुल मिलाकर वापस आ गया है। –

+0

अंतर को हाइलाइट करने के लिए वर्णन और जोड़ा गया 'एनोटेट' संस्करण अपडेट किया गया है यदि एक टॉपिंग एक से अधिक पिज्जा से जुड़ा हुआ है, तो यह 'Pizza.objects.aggregate (topping_count = count (' toppings ') में एकाधिक पिज्जा में शामिल हो जाएगा) ' और इस प्रकार यह गिनती टॉपिंग की कुल संख्या से अधिक वापस आ जाएगी। पिज्जा से जुड़ी टॉपिंग्स की कुल संख्या प्राप्त करने के लिए (डुप्लिकेट गिनती के बिना), शायद आप 'Topping.objects.exclude (pizza_set = none) .count() 'जैसे कुछ करना चाहते हैं। –

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