문제

이 샘플 모델을 고려하십시오.

model_choices = ((u "spam", u "spam"), (u "xoup", u "eggsoup"),)

(한조각)

type = model.charfield (max_length = 4, 선택 = model_choices)

(실제 구현은 도메인 별이며 영어가 아닌 경우 이므로이 샘플은해야합니다.)

쿼리를 만들 때 해당 유형의 필드별로 결과를 정렬하고 결과를 사용자에게 제시하고 싶습니다. 당연히 해당 필드의 디스플레이 이름으로 정렬하고 싶습니다.

라인을 따라 무언가 :

documents = mymodel.objects.filter (...). order_by ( "type")

하지만, [query-set].order_by([field]) eggsoup <spam (인간 독자에게)에도 불구하고 필드 이름으로 만 정렬 할 수 있으므로 스팸 <xoup (기계에)가 발생합니다.

이 인스턴스 세트를 유형별로 정렬하는 것을 고려하십시오.

이름 | 유형

OBJ1 | 스팸

OBJ2 | 스팸

OBJ3 | 스팸

OBJ4 | xoup

OBJ5 | xoup

그러나 이것은 사용자가 볼 수있는 순서입니다. 즉, 사용자는 유형 열의 내부 필드 값이 아니라 디스플레이 이름을 볼 수 있습니다.

이름 | 유형

OBJ1 | 스팸

OBJ2 | 스팸

OBJ3 | 스팸

OBJ4 | 에그 그룹

OBJ5 | 에그 그룹

인간 사용자의 눈에는 올바르게 정렬되지 않습니다.

django에는 디스플레이 이름별로 정렬 할 수있는 기능이 있습니까? 아니면이 "수동으로"달성하는 방법? (디스플레이 이름이 실제 값과 동일한 순서를 갖도록 선택을 바꾸면 옵션이 아닙니다.)

도움이 되었습니까?

해결책

결과 세트가 충분히 작 으면 코드에서 메모리 내 종류의 결과를 수행 할 수 있습니다. 결과를 데이터베이스 수준에서 정렬하는 괜찮은 방법을 생각할 수 없습니다. 디스플레이 이름을 인식하는 저장 프로 시저를 사용하면 원시 SQL을 작성해야합니다. 수동 정렬에 관해서는 다음과 같은 것을 사용할 수 있습니다.

obj_list = list(Model.objects.all())
import operator
obj_list.sort(key=operator.methodcaller('get_foo_display'))

파이썬에서 목록을 정렬하는 방법에 대한 몇 가지 좋은 예는 다음과 같습니다. http://wiki.python.org/moin/howto/sorting

다른 팁

디스플레이 이름이 모델에서 나온다고 가정하면 해당 필드로 정렬하여 원하는 선택을 주문할 수 있습니다.

MODEL_CHOICES = MyModel.objects.all().values_list('value_field', 'display_field').order_by('display_field')
...
type = models.CharField(max_length=4, choices=MODEL_CHOICES)

선택이 귀하의 질문에서 상수라면 상수의 순서를 간단히 변경할 수 있습니다.

MODEL_CHOICES = ((u"XOUP", u"Eggsoup"), (u"SPAM", u"Spam"), )

결국 선택은 튜플 목록 일 뿐이므로 정상적인 파이썬 정렬으로 정렬 할 수 있습니다. 그만큼 파이썬 위키에는 좋은 예가 있습니다 두 번째 요소에 튜플 목록을 분류하는 것.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top