私がやろうとしているのはこれです:
最高スコアの著者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(* fields)
デフォルトでは、によって返される結果は、モデルのメタのオプションで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)
ソートされた上位5人を正確に提供するAlex Martelliのソリューションを使用します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人未満の著者がいる場合は、そこにあります。