내가하려는 것은 이것입니다.
가장 높은 점수를받은 저자 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 (* 필드)
기본적으로 a QuerySet
에 의해 반환 된 결과 ordering
는 모델의 Meta 에있는 옵션에 의해 제공된 순서화 튜플에 따라 정렬됩니다 . 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 명 미만의 저자가있는 경우 거기에 있습니다.