annotate와 aggregate로 DB 레벨에서 데이터 분석/통계내기
Django ORM의 aggregate와 annotate를 활용해 Python이 아닌 DB 레벨에서 효율적으로 데이터 통계 및 분석을 처리하는 방법을 학습하고, F 객체, Q 객체, Subquery와 조합한 복잡한 쿼리 작성 기법을 익힘
핵심 개념: aggregate vs annotate
구분
aggregate
annotate
목적
QuerySet 전체에 대한 요약/통계 값 계산
QuerySet의 각 항목에 대한 주석(계산 필드) 추가
반환값
단일 dict
새로운 QuerySet
사용 예시
전체 상품의 평균 가격, 총 재고 수량
각 상품별 리뷰 개수, 각 카테고리별 상품 수
aggregate(): 전체에 대한 통계
# 전체 상품의 평균 가격, 총 재고 수량
summary_data = Product.objects.aggregate(
avg_price=Avg('price'),
total_stock=Sum('stock')
)
# 가격 범위
price_range = Product.objects.aggregate(
max_price=Max('price'),
min_price=Min('price')
)annotate(): 개별 객체에 정보 추가
values()와 annotate() 순서
values() → annotate(): GROUP BY 효과 발생
annotate() → values(): 단순히 출력할 필드 제한
고급 테크닉
F 객체로 필드 값 연산
Q 객체로 조건부 집계
Subquery로 복잡한 N+1 해결
distinct 옵션
디버깅
Last updated
