2010-03-09 5 views
69

는 난 할 노력하고있어입니다 :쿼리 세트를 정렬하는 좋은 방법은 무엇입니까? - 장고

  • last_name


에 의해 가장 높은 점수 ( Author.objects.order_by('-score')[:30])

  • 위해 저자와 30 개 저자를 얻을 수

    제안 사항이 있으십니까?

  • +2

    @RH : AlexMartelli의 대답을 올바른 해결책으로 확인하는 것은 어떻습니까?(그가 Skeet 녀석을 쫓아 다니지 않는다면 그는 더 이상 대표를 필요로하지 않는다 ...) – PaulMcG

    +0

    간단하고 요점. 이 작동합니다. 감사! – Shilpa

    답변

    125

    무엇

    import operator 
    
    auths = Author.objects.order_by('-score')[:30] 
    ordered = sorted(auths, key=operator.attrgetter('last_name')) 
    
    장고 1.4에서

    및 여러 필드를 제공하여 주문할 수 있습니다 새로운

    에 대해.
    참조 : https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

    order_by (* 필드) 기본적으로

    이하는 QuerySet에 의해 반환 된 결과는 모델의 메타에서 ordering 옵션으로 제공 주문 튜플에 의해 정렬됩니다. order_by 메서드를 사용하여 QuerySet별로이 값을 재정의 할 수 있습니다.

    예 :

    ordered_authors = Author.objects.order_by('-score', 'last_name')[:30] 
    

    결과 상기 last_name 오름차순으로 그리고, score 내림차순으로 정렬한다. "-score" 앞에있는 음수 부호는 내림차순을 나타냅니다. 오름차순이 내포되어 있습니다.

    +0

    @Alex : grazie alex! 그게 좋았어, 나는 운전자 모듈에 대해 읽으려고한다. – RadiantHex

    +3

    이것은 Author.objects.order_by ('- score', 'last_name') [: 30]보다 더 효율적입니까? –

    +4

    @ 브라이언 - "보다 효율적으로" "더 정확하다", "그렇다"를 의미하는 경우. :) 당신의 솔루션은 저자를 점수별로 정렬하여 유지하며, 동일한 점수 (이차 키가 작동하는 방식) 인 저자 만 알파벳 순으로 정렬합니다. Alex는 결과를 가져온 다음 OP와는 다른 정렬 순서 (key = operator.attrgetter를 사용하여 객체 별 키 표현식 정의)를 적용하는 방법을 보여줍니다. – PaulMcG

    3

    여기 컷오프 점수에 대한 연결을 허용하는 방법이 있습니다.

    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)이있다.

    9

    내장 솔루션 (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.

    +10

    결과 # 3은 점수에 따라 내림차순으로 정렬하고 마지막 이름으로 IFF로 정렬합니다. 모든 오브젝트의 점수가 동일합니다. 문제는 결과 집합의 개체 중 동일한 점수가 없으므로 '점수'만 정렬 순서에 영향을 미칩니다. 3 명의 저자 점수를 487로 설정하고 # 3을 다시 실행 해보십시오. – istruble

    +0

    그래, 이해해. 필자는 내장 솔루션 (SQL 전용)이 항상 최상의 솔루션이 아니라는 것을 설명하기를 정말로 원했습니다. – jathanism

    +0

    +1 역 직관적 인 ORDER BY 절의 좋은 예 – PaulMcG

    관련 문제