2010-03-09 21 views
69

मैं क्या करने की कोशिश कर रहा हूँ यह है:एक क्वेरीसेट को सॉर्ट करने के अच्छे तरीके? - Django

  • last_name


द्वारा उच्चतम स्कोर ( Author.objects.order_by('-score')[:30])

  • आदेश लेखकों के साथ 30 लेखक मिल

    कोई सुझाव?

  • +2

    @ आरएच: तो कैसे सही समाधान के रूप में AlexMartelli के जवाब की जांच करने के बारे में?(ऐसा नहीं है कि उसे किसी और प्रतिनिधि की आवश्यकता नहीं है, जब तक वह उस स्कीट लड़के के बाद नहीं जा रहा है ...) – PaulMcG

    +0

    सरल और बिंदु। यह काम। धन्यवाद! – Shilpa

    उत्तर

    125

    क्या

    के बारे में
    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" के सामने नकारात्मक चिह्न अवरोही क्रम इंगित करता है। आरोही आदेश निहित है।

    +0

    @Alex: Grazie Alex! यह बहुत अच्छा था, मैं ऑपरेटर मॉड्यूल के बारे में पढ़ने के लिए बंद हूँ! – RadiantHex

    +3

    क्या यह लेखक.objects.order_by ('- स्कोर', 'last_name') से अधिक कुशल है [: 30]? –

    +4

    @ ब्रायन - यदि "अधिक कुशल" से आपका मतलब है "अधिक सही" तो हाँ, इसकी। :) आपका समाधान लेखक द्वारा बहुत अधिक क्रमबद्ध लेखकों को रखता है, और केवल उसी लेख के साथ उन लेखकों को वर्णित करता है (जो माध्यमिक कुंजी काम करता है)। एलेक्स दिखाता है कि परिणामों को कैसे लेना है, और फिर उन्हें एक पूरी तरह से अलग सॉर्ट ऑर्डर लागू करें (प्रति-ऑब्जेक्ट कुंजी अभिव्यक्ति को परिभाषित करने के लिए key = operator.attrgetter का उपयोग करके), जिसे ओपी ने पूछा था। – PaulMcG

    3

    यहां एक ऐसा तरीका है जो कट ऑफ स्कोर के लिए संबंधों की अनुमति देता है।

    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 से कम लेखकों की है।

    9

    मैं बस यह स्पष्ट करना चाहता था कि अंतर्निहित समाधान (केवल 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।

    +10

    आपका परिणाम # 3 स्कोर द्वारा अवरोही क्रमबद्ध है और फिर अंतिम_नाम IFF द्वारा किसी ऑब्जेक्ट का एक ही स्कोर होता है। समस्या यह है कि आपके परिणाम सेट में मौजूद वस्तुओं में से कोई भी एक ही स्कोर नहीं है, इसलिए केवल '-कोर' सॉर्ट ऑर्डर को प्रभावित कर रहा है। 3 लेखकों के स्कोर को 487 पर सेट करने का प्रयास करें और फिर से # 3 चलाएं। – istruble

    +0

    हाँ मैं इसे समझता हूं। मैं वास्तव में बस यह बताना चाहता था कि अंतर्निहित समाधान (केवल SQL) केवल सर्वोत्तम नहीं होते हैं। – jathanism

    +0

    +1 खंड – PaulMcG

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