는 난 할 노력하고있어입니다 :쿼리 세트를 정렬하는 좋은 방법은 무엇입니까? - 장고
이
last_name
에 의해 가장 높은 점수 (
Author.objects.order_by('-score')[:30]
)
위해 저자와 30 개 저자를 얻을 수
제안 사항이 있으십니까?
는 난 할 노력하고있어입니다 :쿼리 세트를 정렬하는 좋은 방법은 무엇입니까? - 장고
이 last_name
Author.objects.order_by('-score')[:30]
)
위해 저자와 30 개 저자를 얻을 수
제안 사항이 있으십니까?
무엇
import operator
auths = Author.objects.order_by('-score')[:30]
ordered = sorted(auths, key=operator.attrgetter('last_name'))
장고 1.4에서
및 여러 필드를 제공하여 주문할 수 있습니다 새로운
에 대해.order_by (* 필드) 기본적으로
이하는 QuerySet
에 의해 반환 된 결과는 모델의 메타에서 ordering
옵션으로 제공 주문 튜플에 의해 정렬됩니다. order_by
메서드를 사용하여 QuerySet별로이 값을 재정의 할 수 있습니다.
예 :
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
결과 상기 last_name
오름차순으로 그리고, score
내림차순으로 정렬한다. "-score"
앞에있는 음수 부호는 내림차순을 나타냅니다. 오름차순이 내포되어 있습니다.
@Alex : grazie alex! 그게 좋았어, 나는 운전자 모듈에 대해 읽으려고한다. – RadiantHex
이것은 Author.objects.order_by ('- score', 'last_name') [: 30]보다 더 효율적입니까? –
@ 브라이언 - "보다 효율적으로" "더 정확하다", "그렇다"를 의미하는 경우. :) 당신의 솔루션은 저자를 점수별로 정렬하여 유지하며, 동일한 점수 (이차 키가 작동하는 방식) 인 저자 만 알파벳 순으로 정렬합니다. Alex는 결과를 가져온 다음 OP와는 다른 정렬 순서 (key = operator.attrgetter를 사용하여 객체 별 키 표현식 정의)를 적용하는 방법을 보여줍니다. – PaulMcG
여기 컷오프 점수에 대한 연결을 허용하는 방법이 있습니다.
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)
이있다.
내장 솔루션 (SQL 전용)이 항상 최상의 것은 아니라는 것을 설명하기를 원했습니다. 당신이 기대하는대로 작동하지 않습니다,
ordered_authors = Author.objects.order_by('-score', 'last_name')[:30]
을하지만 : 처음에는 장고의 QuerySet.objects.order_by
방법은 여러 인수를 허용하기 때문에, 당신은 쉽게 체인 수 있다고 생각했다. 적절한 예는, 첫 번째는 (쉽게 읽을 상위 5 개를 선택) 별 정렬 대통령의 목록입니다
>>> 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)
: 정확하게
last_name
으로 분류 상단 오명을 제공 알렉스 마르 텔리의 솔루션을 사용하여
>>> 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)
그리고 지금 결합 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)
xpect.
@RH : AlexMartelli의 대답을 올바른 해결책으로 확인하는 것은 어떻습니까?(그가 Skeet 녀석을 쫓아 다니지 않는다면 그는 더 이상 대표를 필요로하지 않는다 ...) – PaulMcG
간단하고 요점. 이 작동합니다. 감사! – Shilpa