আমি যা করার চেষ্টা করছি তা হ'ল:
সর্বোচ্চ স্কোর সহ 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'))
জাজানো ১.৪ এবং আরও নতুনতে আপনি একাধিক ক্ষেত্র সরবরাহ করে অর্ডার করতে পারেন।
তথ্যসূত্র: 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"অবতরণ ক্রমানুসারে নির্দেশ করে। আরোহী আদেশ জড়িত হয়।
lambda x: x.last_name? এটি খাটো, আরও ভার্বোজ এবং কোনও আমদানির প্রয়োজন নেই।
আমি কেবল চিত্রিত করতে চেয়েছিলাম যে অন্তর্নির্মিত সমাধানগুলি (এসকিউএল-কেবলমাত্র) সর্বদা সেরা হয় না। প্রথমে আমি ভেবেছিলাম যে জ্যাঙ্গোর 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)
আপনি দেখতে পাচ্ছেন এটি প্রথমটির মতো একই ফলাফল, যার অর্থ এটি আপনি যেমনটি আশা করেন তেমন কাজ করে না।
এখানে এমন একটি উপায় যা কাট-অফ স্কোরের জন্য বন্ধনের অনুমতি দেয়।
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 টিরও কম লেখক থাকলে আপনার মনে হয়।