장고) pk 리스트에 등록된 순서대로 오브젝트를 가져오기 예제

작성자: [관리자] 하얀설표

2025.06.29 14:40 (KST) 작성됨






 

Since Django 1.8, you can do:

from django.db.models import Case, When

import MyModel

pk_list = [10, 2, 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)

 

출처 : Django get a QuerySet from array of id's in specific order

 

다음과 같은 상황에서 사용할 수 있는 방법이다.

  1. 리스트 안의 내용물이 오브젝트의 pk 또는 유니크 필드의 값인 경우
  2. 내용물이 임의의 기준으로 정렬된 것일 것
  3. 리스트 내용물의 순서에 맞춰서 쿼리셋 순서를 유지할 것

 

정렬 기준이 모든 대상에 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)

 

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Django 관련 게시물

분류없음
해결) 장고 bulk_update의 메모리 누수 문제(django orm bluk_update method memory leak)
수정 07.12 | [관리자] 하얀설표
👍 0
#Python, #Django
🗨️ 0
분류없음
거지같은 subQuery와 outerRef
수정 06.29 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0
분류없음
해결) django.db.utils.OperationalError: database is locked
수정 06.18 | [관리자] 하얀설표
👍 0
#Python, #에러해결, #Django
🗨️ 0
썸네일
분류없음
장고 예제) 게시판 기능 만들기
수정 06.17 | [관리자] 하얀설표
👍 0
#Django, #Django 예제
🗨️ 0
분류없음
장고 튜토리얼) settings.py 분리하기
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
썸네일
분류없음
장고 튜토리얼) 패키지 설치와 프로젝트 설치 및 실행 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
분류없음
장고 튜토리얼) 관리자 계정과 일반 계정 만드는 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
분류없음
장고 튜토리얼) makemigrations와 migrate 알아보기(migration과 database)
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
분류없음
장고) 게시판 템플릿 쉽게 만드는 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0
분류없음
장고) prefetch, annotate는 count annotate에 영향을 준다.
수정 05.31 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0