मैं क्या करने की कोशिश कर रहा हूँ यह है:एक क्वेरीसेट को सॉर्ट करने के अच्छे तरीके? - Django
last_name
द्वारा उच्चतम स्कोर (
Author.objects.order_by('-score')[:30]
)
आदेश लेखकों के साथ 30 लेखक मिल
कोई सुझाव?
मैं क्या करने की कोशिश कर रहा हूँ यह है:एक क्वेरीसेट को सॉर्ट करने के अच्छे तरीके? - Django
last_name
Author.objects.order_by('-score')[:30]
)
आदेश लेखकों के साथ 30 लेखक मिल
कोई सुझाव?
क्या
के बारे मेंimport operator
auths = Author.objects.order_by('-score')[:30]
ordered = sorted(auths, key=operator.attrgetter('last_name'))
Django 1.4 में और नए आप एक से अधिक क्षेत्रों प्रदान करके आदेश कर सकते हैं।
संदर्भ: https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
order_by (* क्षेत्रों)
डिफ़ॉल्ट रूप से, एक QuerySet
द्वारा लौटाए गए परिणामों मॉडल की मेटा में ordering
विकल्प द्वारा दिए गए आदेश टपल द्वारा आदेश दिया गया है। order_by
विधि का उपयोग कर आप प्रति-क्वेरीसेट आधार पर इसे ओवरराइड कर सकते हैं।
उदाहरण:
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
परिणाम ऊपर score
उतरते द्वारा, last_name
आरोही द्वारा आदेश दिया हो जाएगा तो। "-score"
के सामने नकारात्मक चिह्न अवरोही क्रम इंगित करता है। आरोही आदेश निहित है।
@Alex: Grazie Alex! यह बहुत अच्छा था, मैं ऑपरेटर मॉड्यूल के बारे में पढ़ने के लिए बंद हूँ! – RadiantHex
क्या यह लेखक.objects.order_by ('- स्कोर', 'last_name') से अधिक कुशल है [: 30]? –
@ ब्रायन - यदि "अधिक कुशल" से आपका मतलब है "अधिक सही" तो हाँ, इसकी। :) आपका समाधान लेखक द्वारा बहुत अधिक क्रमबद्ध लेखकों को रखता है, और केवल उसी लेख के साथ उन लेखकों को वर्णित करता है (जो माध्यमिक कुंजी काम करता है)। एलेक्स दिखाता है कि परिणामों को कैसे लेना है, और फिर उन्हें एक पूरी तरह से अलग सॉर्ट ऑर्डर लागू करें (प्रति-ऑब्जेक्ट कुंजी अभिव्यक्ति को परिभाषित करने के लिए key = operator.attrgetter का उपयोग करके), जिसे ओपी ने पूछा था। – PaulMcG
यहां एक ऐसा तरीका है जो कट ऑफ स्कोर के लिए संबंधों की अनुमति देता है।
author_count = Author.objects.count()
cut_off_score = Author.objects.order_by('-score').values_list('score')[min(30, author_count)]
top_authors = Author.objects.filter(score__gte=cut_off_score).order_by('last_name')
आप top_authors में 30 से अधिक लेखकों इस तरह से प्राप्त कर सकते हैं और min(30,author_count)
है बैठाना आप 30 से कम लेखकों की है।
मैं बस यह स्पष्ट करना चाहता था कि अंतर्निहित समाधान (केवल SQL) केवल सर्वोत्तम नहीं होते हैं। पहले तो मैंने सोचा था कि क्योंकि Django के QuerySet.objects.order_by
विधि कई तर्क स्वीकार करता है, आप आसानी से उन्हें श्रृंखला सकता है:
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
लेकिन, जैसा कि आप उम्मीद करेंगे यह काम नहीं करता। बिंदु में प्रकरण, पहले स्कोर के अनुसार क्रमबद्ध अध्यक्षों की एक सूची है (आसानी से पढ़ने के लिए का चयन शीर्ष 5):
>>> auths = Author.objects.order_by('-score')[:5]
>>> for x in auths: print x
...
James Monroe (487)
Ulysses Simpson (474)
Harry Truman (471)
Benjamin Harrison (467)
Gerald Rudolph (464)
एलेक्स मार्टेली के समाधान जो सही रूप में शीर्ष 5 लोगों last_name
के अनुसार क्रमबद्ध प्रदान करता है का उपयोग करना:
>>> for x in sorted(auths, key=operator.attrgetter('last_name')): print x
...
Benjamin Harrison (467)
James Monroe (487)
Gerald Rudolph (464)
Ulysses Simpson (474)
Harry Truman (471)
और अब संयुक्त order_by
कॉल:
>>> myauths = Author.objects.order_by('-score', 'last_name')[:5]
>>> for x in myauths: print x
...
James Monroe (487)
Ulysses Simpson (474)
Harry Truman (471)
Benjamin Harrison (467)
Gerald Rudolph (464)
आप यह पहली बार एक के रूप में एक ही परिणाम है देखते हैं, जिसका अर्थ है के रूप में आप ई होगा यह काम नहीं करता सकते हैं Xpect।
आपका परिणाम # 3 स्कोर द्वारा अवरोही क्रमबद्ध है और फिर अंतिम_नाम IFF द्वारा किसी ऑब्जेक्ट का एक ही स्कोर होता है। समस्या यह है कि आपके परिणाम सेट में मौजूद वस्तुओं में से कोई भी एक ही स्कोर नहीं है, इसलिए केवल '-कोर' सॉर्ट ऑर्डर को प्रभावित कर रहा है। 3 लेखकों के स्कोर को 487 पर सेट करने का प्रयास करें और फिर से # 3 चलाएं। – istruble
हाँ मैं इसे समझता हूं। मैं वास्तव में बस यह बताना चाहता था कि अंतर्निहित समाधान (केवल SQL) केवल सर्वोत्तम नहीं होते हैं। – jathanism
+1 खंड – PaulMcG
@ आरएच: तो कैसे सही समाधान के रूप में AlexMartelli के जवाब की जांच करने के बारे में?(ऐसा नहीं है कि उसे किसी और प्रतिनिधि की आवश्यकता नहीं है, जब तक वह उस स्कीट लड़के के बाद नहीं जा रहा है ...) – PaulMcG
सरल और बिंदु। यह काम। धन्यवाद! – Shilpa