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