2009-05-19 3 views
24

Django QuerySet에서 특정 주문을 어떻게 정의합니까?Django의 주문 방법

특히 QuerySet 인 경우 : ['a10', 'a1', 'a2']입니다.

Whatever.objects.order_by('someField')을 사용하는 정규식은 을 (를) 사용하는 동안 ['a1', 'a10', 'a2']을 제공합니다.

내 주문 방법을 정의하는 올바른 방법은 무엇입니까?

답변

39

내가 알고있는 한, 너무 백엔드와 관련이 있으므로 데이터베이스 측 순서를 지정하는 방법은 없습니다. 당신은 좋은 구식 파이썬 정렬에 의존 할 수 있습니다 : 당신이 많이 정렬의이 종류를 필요로하는 자신을 발견 할 경우

class Foo(models.Model): 
    name = models.CharField(max_length=128) 

Foo.objects.create(name='a10') 
Foo.objects.create(name='a1') 
Foo.objects.create(name='a2') 

ordered = sorted(Foo.objects.all(), key=lambda n: (n[0], int(n[1:]))) 
print ordered # yields a1, a2, 10 

, 나는 순서를 수행 모델에 대한 사용자 정의 models.Manager 서브 클래스를 만드는 것을 권 해드립니다. 예 :

class FooManager(models.Manager): 
    def in_a_number_order(self, *args, **kwargs): 
     qs = self.get_query_set().filter(*args, **kwargs) 
     return sorted(qs, key=lambda n: (n[0], int(n[1:]))) 

class Foo(models.Model): 
    ... as before ... 
    objects = FooManager() 

print Foo.objects.in_a_number_order() 
print Foo.objects.in_a_number_order(id__in=[5, 4, 3]) # or any filtering expression 
+0

스팟! 멋진 대답, 고마워! –

+2

이 메서드를 사용할 때이 오류가 발생합니다. : \t 'Model'개체가 인덱싱되지 않습니다 – ninja123

+0

'정렬 '하면 쿼리 집합을 반환합니까? 그것이 queryset을 통과했다는 것을 감안할 때, 나는 그렇게 생각할 것이다. 그러나 나는 정렬을 위해 내부적으로 또는리스트로 변환 될 수도 있다고 생각하고있다. –

0

사용 위치에 따라 다릅니다.

자신의 템플릿에서 사용하려면 템플릿 태그를 작성하여 주문하십시오. 그 중 원하는 정렬 알고리즘을 사용할 수 있습니다.

관리자에서 나는 정의 내 요구에 템플릿을 확장하고 (파이썬에서 정렬을) 자렛의 대답 @

25

상기 한 바와 같이 템플릿 태그를로드하여 정렬 않는 것은 간단한 경우에 잘 작동합니다. 큰 테이블을 갖고 있고, 말하자면, 결과의 첫 페이지 만 특정 방식으로 정렬하기를 원할 때,이 접근 방식은 중단됩니다 (정렬을 수행하기 전에 데이터베이스에서 모든 단일 행을 가져와야합니다). 이 시점에서 저장 시간에 "이름"필드에서 채우는 비정규 화 된 "정렬"필드를 추가하여 DB 레벨에서 일반적인 방식으로 정렬 할 수 있습니다.

+2

성능 관련 문제를 해결하기 위해 +1; 실제로 DB-Agnostic 환경에서 보고서에 사용되는 일부 데이터에 사용 된 제안이 있으며 수천만 행이 있으므로 잘 작동한다고 보증 할 수 있습니다 . –

0

더 큰 데이터 세트를 가지고 있고 추가로 (예를 들어, 건초 더미 포함) SOLR 백엔드를 사용하는 경우 : 정렬 필드 유형으로 numeric=true 옵션을

사용 solr.ICUCollationField을. 이것은 언어에 따라 정렬되며 숫자가있는 경우 문자열 정렬 대신 숫자 규칙에 따라 숫자 부분을 정렬합니다.

참조 :에 https://cwiki.apache.org/confluence/display/solr/Language+Analysis#LanguageAnalysis-UnicodeCollation http://www.solr-start.com/javadoc/solr-lucene/org/apache/solr/schema/ICUCollationField.html