Since Django 1.8, you can do:
출처 : Django get a QuerySet from array of id's in specific order |
다음과 같은 상황에서 사용할 수 있는 방법이다.
- 리스트 안의 내용물이 오브젝트의 pk 또는 유니크 필드의 값인 경우
- 내용물이 임의의 기준으로 정렬된 것일 것
- 리스트 내용물의 순서에 맞춰서 쿼리셋 순서를 유지할 것
정렬 기준이 모든 대상에 1:1로 대응하는 경우
이 경우에는 큰 어려움 없이 그대로 적용하면 된다.
from django.db.models import Case, When
import MyModel
pk_list = [5, 3, 9, 1]
preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)])
queryset = MyModel.objects.filter(pk__in=pk_list).order_by(preserved)
정렬 기준이 모든 대상에 1:1로 대응하지 않는 경우
대응하지 않는 오브젝트에 대해 임의 기준을 추가할 수 있다.
다음은 pk list에 pk가 포함되지 않은 객체를 뒤로 보내도록 하는 예시다.
from django.db.models import Case, When, Value, IntegerField, F
import MyModel
pk_list = [5, 3, 9, 1]
preserved = Case(
*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)],
default=Value(len(pk_list)),
output_field=IntegerField(),
)
queryset = MyModel.objects.all().order_by(preserved)