장고

django aggregate

content0474 2024. 12. 27. 21:02

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