Django QuerySet
에서 특정 주문을 어떻게 정의합니까?Django의 주문 방법
특히 QuerySet
인 경우 : ['a10', 'a1', 'a2']
입니다.
Whatever.objects.order_by('someField')
을 사용하는 정규식은 을 (를) 사용하는 동안 ['a1', 'a10', 'a2']
을 제공합니다.
내 주문 방법을 정의하는 올바른 방법은 무엇입니까?
Django QuerySet
에서 특정 주문을 어떻게 정의합니까?Django의 주문 방법
특히 QuerySet
인 경우 : ['a10', 'a1', 'a2']
입니다.
Whatever.objects.order_by('someField')
을 사용하는 정규식은 을 (를) 사용하는 동안 ['a1', 'a10', 'a2']
을 제공합니다.
내 주문 방법을 정의하는 올바른 방법은 무엇입니까?
내가 알고있는 한, 너무 백엔드와 관련이 있으므로 데이터베이스 측 순서를 지정하는 방법은 없습니다. 당신은 좋은 구식 파이썬 정렬에 의존 할 수 있습니다 : 당신이 많이 정렬의이 종류를 필요로하는 자신을 발견 할 경우
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
사용 위치에 따라 다릅니다.
자신의 템플릿에서 사용하려면 템플릿 태그를 작성하여 주문하십시오. 그 중 원하는 정렬 알고리즘을 사용할 수 있습니다.
관리자에서 나는 정의 내 요구에 템플릿을 확장하고 (파이썬에서 정렬을) 자렛의 대답 @
상기 한 바와 같이 템플릿 태그를로드하여 정렬 않는 것은 간단한 경우에 잘 작동합니다. 큰 테이블을 갖고 있고, 말하자면, 결과의 첫 페이지 만 특정 방식으로 정렬하기를 원할 때,이 접근 방식은 중단됩니다 (정렬을 수행하기 전에 데이터베이스에서 모든 단일 행을 가져와야합니다). 이 시점에서 저장 시간에 "이름"필드에서 채우는 비정규 화 된 "정렬"필드를 추가하여 DB 레벨에서 일반적인 방식으로 정렬 할 수 있습니다.
성능 관련 문제를 해결하기 위해 +1; 실제로 DB-Agnostic 환경에서 보고서에 사용되는 일부 데이터에 사용 된 제안이 있으며 수천만 행이 있으므로 잘 작동한다고 보증 할 수 있습니다 . –
더 큰 데이터 세트를 가지고 있고 추가로 (예를 들어, 건초 더미 포함) 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
스팟! 멋진 대답, 고마워! –
이 메서드를 사용할 때이 오류가 발생합니다. : \t 'Model'개체가 인덱싱되지 않습니다 – ninja123
'정렬 '하면 쿼리 집합을 반환합니까? 그것이 queryset을 통과했다는 것을 감안할 때, 나는 그렇게 생각할 것이다. 그러나 나는 정렬을 위해 내부적으로 또는리스트로 변환 될 수도 있다고 생각하고있다. –