Answers:
关于什么
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(*字段)
默认情况下,a返回的结果由模型的Meta中QuerySet
的ordering
选项给出的排序元组排序。您可以使用order_by
方法基于每个QuerySet重写此方法。
例:
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
上面的结果将按score
降序排列,然后按last_name
升序排列。前面的负号"-score"
表示降序。隐含升序。
lambda x: x.last_name
?它更短,更详细,并且不需要任何导入。
我只是想说明一下内置解决方案(仅适用于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)
使用Alex Martelli的解决方案,该解决方案可准确提供排名前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多位作者,如果您的作者少于30位,则可以在此处找到min(30,author_count)
。