Recent Posts
Tags
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 네이버부스트캠프
- boostcourse
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- Django
- 빅분기
- 데이터베이스
- 부스트코스
- 파이썬
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 기초다지기
- PY4E
- 정보처리기사
- 오라클
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- DB
- Ai
- 프로그래머스
- 인공지능기초다지기
- boostcoures
- 이기적
- python
- AI 플랫폼을 활용한 데이터 분석
- 빅데이터분석기사
- 코딩테스트 python
- r
- Oracle
- SQL
- 코딩테스트
- unsub
- Today
- Total
매일공부
[Django] Prefetch는 어떤 역할을 하는가 본문
Q. prefetch_related는 알겠는데, Prefetch 객체는 왜 따로 쓰는가?
prefetch_related만 쓰면 관련 객체를 전부 가져온다. 하지만 관련 객체 중 일부만(예: 삭제되지 않은 항목만) 가져오고 싶을 때는 그 조건을 명시할 방법이 없다. 이때 Prefetch 객체를 쓰면, "이 관계를 prefetch할 때 어떤 queryset을 쓸지"를 직접 지정할 수 있다.
예를 들어 상세 항목 중 is_deleted=False인 것만 표시하고 싶다면, Prefetch 객체로 queryset을 명시한다.
# Mixin의 필터/검색/정렬 적용 후 is_deleted 필터 추가
# 관련 데이터(user, group, state)도 함께 조회(select_related)하여 성능 최적화
def get_queryset(self):
active_details = QuotationDetail.objects.filter(is_deleted=False).select_related("prod")
queryset = (
super()
.get_queryset()
.filter(is_deleted=False)
.select_related("user", "user__group", "state")
.prefetch_related(Prefetch("quo_details", queryset=active_details))
)
# 상태 필터
state_filter = self.request.GET.get("state_filter", "")
if state_filter:
queryset = queryset.filter(state__state_id=state_filter)
return queryset
정리
- select_related: 정방향 관계(ForeignKey, OneToOne)를 SQL JOIN으로 한 번에 가져온다. 여기서는 user, user__group, state.
- prefetch_related: 역방향/다대다 관계를 별도 쿼리로 가져와서 Python 레벨에서 합쳐준다. 여기서는 quo_details.
- Prefetch(관계이름, queryset=...): prefetch_related가 가져올 관련 객체의 범위를 직접 지정한다. 여기서는 quo_details 중 삭제되지 않은 것만, 그리고 그 안에서도 prod를 미리 select_related해서 N+1 쿼리를 한 번 더 줄였다.
즉 이 코드는 "목록 화면에서 삭제되지 않은 항목과 그 상세(삭제되지 않은 것만) + 연관 데이터를 최소한의 쿼리로 가져오기" 위한 최적화다. Prefetch 없이 그냥 prefetch_related("quo_details")만 썼다면, 삭제된 상세 항목까지 다 가져온 뒤 템플릿이나 코드에서 걸러내야 했을 것이다.
'IT > 작업기록' 카테고리의 다른 글
| [Bootstrap] mt-1, p-2... 여백 유틸리티 클래스 정리 (0) | 2026.05.08 |
|---|---|
| [인프라 공부] CI/CD, 혼자 개발해도 해야 하나? (0) | 2026.04.22 |
| [Django] pytest "app_label" 에러 — 그리고 이게 배포엔 왜 상관없는지 (0) | 2026.04.22 |
| [Python] mypy는 왜 쓰는가 — 동적 타이핑 언어에 왜 타입을 입히나 (0) | 2026.04.22 |
| Django + Docker 개발/운영 환경 분리 및 NAS 배포 정리 (0) | 2026.04.14 |
Comments