मैं यह करने की कोशिश कर रहा हूं:
उच्चतम स्कोर के साथ 30 लेखक प्राप्त करें (
Author.objects.order_by('-score')[:30]
)लेखकों को आदेश दें
last_name
कोई सुझाव?
मैं यह करने की कोशिश कर रहा हूं:
उच्चतम स्कोर के साथ 30 लेखक प्राप्त करें ( Author.objects.order_by('-score')[:30]
)
लेखकों को आदेश दें last_name
कोई सुझाव?
जवाबों:
व्हाट अबाउट
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"
अवरोही क्रम के सामने नकारात्मक संकेत इंगित करता है। आरोही क्रम निहित है।
lambda x: x.last_name
? यह छोटा है, अधिक क्रिया है और किसी भी आयात की आवश्यकता नहीं है।
मैं केवल यह वर्णन करना चाहता था कि अंतर्निहित समाधान (एसक्यूएल-ओनली) हमेशा सबसे अच्छे नहीं होते हैं। पहले तो मैंने सोचा कि क्योंकि 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)
जैसा कि आप देख सकते हैं कि यह पहले वाले के समान परिणाम है, जिसका अर्थ है कि यह काम नहीं करेगा जैसा कि आप उम्मीद करेंगे।
यहां एक तरीका है जो कट-ऑफ स्कोर के लिए संबंधों की अनुमति देता है।
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 से कम लेखक हैं।