একটি ক্যুরিসেট সাজানোর ভাল উপায়? - জ্যাঙ্গো


111

আমি যা করার চেষ্টা করছি তা হ'ল:

  • সর্বোচ্চ স্কোর সহ 30 জন লেখক পান ( Author.objects.order_by('-score')[:30])

  • দ্বারা লেখকদের অর্ডার last_name


কোনও পরামর্শ?


4
@ আরএইচ: তাহলে কীভাবে অ্যালেক্সমার্টেলির উত্তর সঠিক সমাধান হিসাবে যাচাই করবেন? (এমন নয় যে তার আর কোনও প্রতিনিধি দরকার নেই, যদি না সে সেই স্কিট লোকের পিছনে চলে ...)
পলমিসজি

উত্তর:


190

কি সম্পর্কে

import operator

auths = Author.objects.order_by('-score')[:30]
ordered = sorted(auths, key=operator.attrgetter('last_name'))

জাজানো ১.৪ এবং আরও নতুনতে আপনি একাধিক ক্ষেত্র সরবরাহ করে অর্ডার করতে পারেন।
তথ্যসূত্র: 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আরোহণের মাধ্যমে। সামনে Theণাত্মক চিহ্নটি "-score"অবতরণ ক্রমানুসারে নির্দেশ করে। আরোহী আদেশ জড়িত হয়।


1
@ অ্যালেক্স: গ্রেজি অ্যালেক্স! এটি দুর্দান্ত ছিল, আমি অপারেটর মডিউল সম্পর্কে পড়তে চলেছি!
RadiantHex

3
এটি লেখক.ওবজেক্টস.অর্ডার_বি ('- স্কোর', 'শেষের নাম') এর চেয়ে আরও দক্ষ [[30]?
ব্রায়ান লুফট

4
@ ব্রায়ান - যদি "আরও দক্ষ" দ্বারা আপনার বোঝানো হয় "আরও সঠিক" তবে হ্যাঁ, এটি। :) আপনার সমাধান লেখককে স্কোর অনুসারে অনেকটা সাজিয়ে রেখেছে, এবং কেবল একই স্কোর (যারা মাধ্যমিক কীগুলি কাজ করে) এর সাথে সেই লেখকদের বর্ণমালা করে। অ্যালেক্স ফলাফলগুলি কীভাবে নেবে তা দেখায় এবং তারপরে তাদের কাছে সম্পূর্ণ আলাদা সাজানোর ক্রম প্রয়োগ করুন (প্রতি-বস্তুর কী এক্সপ্রেশনটি সংজ্ঞায়িত করতে key = অপারেটর.আত্রট্রেটার ব্যবহার করে), যা ওপি চেয়েছিল।
পলমিসজি

@ পল: আমি যা চেয়েছিলাম তা নয়, অ্যালেক্সের উত্তরটি সঠিক!
RadiantHex

4
বাছাইয়ের কী কার্যকারিতা তৈরি করছেন না lambda x: x.last_name? এটি খাটো, আরও ভার্বোজ এবং কোনও আমদানির প্রয়োজন নেই।
ক্রিজিসটফ স্জুলারজ

12

আমি কেবল চিত্রিত করতে চেয়েছিলাম যে অন্তর্নির্মিত সমাধানগুলি (এসকিউএল-কেবলমাত্র) সর্বদা সেরা হয় না। প্রথমে আমি ভেবেছিলাম যে জ্যাঙ্গোর QuerySet.objects.order_byপদ্ধতি একাধিক যুক্তি গ্রহণ করে, আপনি সহজেই তাদের শৃঙ্খলাবদ্ধ করতে পারেন:

ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]

তবে, এটি আপনি যেমন আশা করেছিলেন তেমন কাজ করে না। ঘটনাচক্রে, প্রথম হ'ল স্কোর অনুসারে বাছাই করা রাষ্ট্রপতির তালিকা (সহজ পড়ার জন্য শীর্ষ পাঁচটি নির্বাচন করা):

>>> 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)

আপনি দেখতে পাচ্ছেন এটি প্রথমটির মতো একই ফলাফল, যার অর্থ এটি আপনি যেমনটি আশা করেন তেমন কাজ করে না।


13
আপনার ফলাফল # 3 স্কোর অনুসারে বাছাই করছে এবং তারপরে সর্বশেষ নাম আইএফএফ দ্বারা কোনও বস্তুর সমান স্কোর রয়েছে। সমস্যাটি হ'ল আপনার ফলাফলের সেটগুলির মধ্যে যে কোনও একটিরই একই স্কোর নেই তাই কেবলমাত্র '-স্কোর' বাছাইয়ের ক্রমকে প্রভাবিত করে। 3 জন লেখকের স্কোর 487 এ সেট করার চেষ্টা করুন এবং আবার # 3 চালান।
istruble

হ্যাঁ আমি এটা বুঝতে পারি। আমি সত্যিই কেবল চিত্রিত করতে চেয়েছিলাম যে অন্তর্নির্মিত সমাধানগুলি (এসকিউএল-কেবলমাত্র) সর্বদা সর্বোত্তম নয়।
jathanism

3
এটি আমার প্রত্যাশার সাথে ঠিকঠাক হয়েছিল: লিক্সোগ্রাফিক অর্ডারিং (যা প্রথম সাজানোর কীটি পৃথক পৃথক হলে তাত্পর্যপূর্ণ) which
জোনাস কলকার

5

এখানে এমন একটি উপায় যা কাট-অফ স্কোরের জন্য বন্ধনের অনুমতি দেয়।

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')

আপনি এইভাবে শীর্ষ-লেখকগুলিতে 30 টিরও বেশি লেখক পেতে পারেন এবং min(30,author_count)30 টিরও কম লেখক থাকলে আপনার মনে হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.