aggregate는 데이터베이스의 여러 행을 기반으로 계산된 요약값을 반환
Django ORM에서는 aggregate 메서드와 함께 Sum, Avg, Max, Min, Count 등의 함수를 함께 사용
from django.db.models import Sum, Avg, Max, Min
# 예제: 모든 주문의 총 가격 계산
Order.objects.aggregate(total_price=Sum('price'))
# 예제: 평균 점수 계산
Student.objects.aggregate(average_score=Avg('score'))
Aggregate와 Annotate의 차이점
aggregate: 전체 쿼리셋에 대해 하나의 값을 반환
annotate: 각 객체에 대한 값을 계산하여 추가적인 필드로 반환
# Aggregate 예제
Product.objects.aggregate(max_price=Max('price'))
# Annotate 예제
Product.objects.annotate(sales_count=Count('sales'))
여러 통계를 동시에 계산하기
aggregate를 사용할 때 여러 통계값을 동시에 계산하는 것도 가능함
Product.objects.aggregate(
total_sales=Sum('sales'),
max_price=Max('price'),
min_price=Min('price')
)
필터와 함께 사용하기
aggregate는 필터와 함께 사용하여 특정 조건에 해당하는 데이터만 요약할 수 있음
Order.objects.filter(status='completed').aggregate(total_revenue=Sum('price'))
Group By와 함께 사용하기
만약 그룹별 통계를 원한다면 annotate를 사용해야 하며, aggregate는 전체 데이터를 기준으로 계산됨
즉, 그룹별 계산은 annotate로, 전체 계산은 aggregate로 처리해야 함
Category.objects.annotate(total_sales=Sum('product__sales'))
Aggregate 사용 시 주의할 점
반환값은 딕셔너리 형태
복잡한 쿼리를 작성할 때는 성능을 고려해야 하며, 데이터베이스에서 실제 실행되는 SQL을 확인하면 도움이 됨
result = Product.objects.aggregate(max_price=Max('price'))
print(result) # {'max_price': 1000}
'장고' 카테고리의 다른 글
django CustomUserModel (0) | 2024.12.26 |
---|---|
Django REST Framework permission class (0) | 2024.12.24 |
django JWT (0) | 2024.12.23 |
Django Rest Framework (1) | 2024.12.19 |
RESTful API (0) | 2024.12.18 |