Django ORM의 aggregate(): 쿼리셋 데이터 집계와 통계를 간편하게 처리하는 방법
aggregate() 메서드를 활용해 쿼리셋의 데이터를 집계하고 통계를 추출하는 방법
Django ORM에서 aggregate()란 무엇인가?
Django ORM의 aggregate()
메서드는 쿼리셋 전체에 대한 집계 작업을 수행하여 단일 값을 반환하는 데 사용됩니다. 주로 데이터 집계와 통계 계산을 위해 사용되며, 데이터베이스의 집계 함수(SQL Aggregate Functions)를 활용합니다.
aggregate()의 역할
aggregate()
는 SQL의 SUM
, AVG
, MAX
, MIN
, COUNT
와 같은 집계 함수를 Django 쿼리셋에서 간단하게 사용할 수 있도록 합니다. 이 메서드는 쿼리셋의 모든 데이터를 기준으로 계산된 단일 값을 반환합니다.
예를 들어, 상품 테이블에서 모든 상품의 평균 가격을 계산하거나, 총 주문 수를 계산하는 데 사용됩니다.
aggregate()의 기본 사용법
먼저, django.db.models
에서 집계 함수들을 임포트합니다.
1
from django.db.models import Count, Sum, Avg, Max, Min
기본 예제
1
2
3
4
5
6
from django.db.models import Avg
from myapp.models import Product
# 모든 상품의 평균 가격 계산
result = Product.objects.aggregate(average_price=Avg('price'))
print(result['average_price'])
위 코드에서 aggregate()
는 사전 형태로 결과를 반환하며, 키는 우리가 지정한 이름(average_price
)입니다.
aggregate()와 함께 사용하는 집계 함수
1. Count
레코드 개수를 계산합니다.
1
2
3
4
5
from django.db.models import Count
# 주문 수 계산
result = Order.objects.aggregate(total_orders=Count('id'))
print(result['total_orders'])
2. Sum
필드 값의 총합을 계산합니다.
1
2
3
4
5
from django.db.models import Sum
# 모든 주문의 총 금액 계산
result = Order.objects.aggregate(total_amount=Sum('amount'))
print(result['total_amount'])
3. Avg
평균 값을 계산합니다.
1
2
3
4
5
from django.db.models import Avg
# 평균 점수 계산
result = Review.objects.aggregate(average_score=Avg('score'))
print(result['average_score'])
4. Max
와 Min
최댓값과 최솟값을 계산합니다.
1
2
3
4
5
from django.db.models import Max, Min
# 가장 비싼 상품과 가장 저렴한 상품 가격 계산
result = Product.objects.aggregate(max_price=Max('price'), min_price=Min('price'))
print(result['max_price'], result['min_price'])
여러 집계 함수 사용하기
aggregate()
메서드에서 여러 집계 함수를 동시에 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
from django.db.models import Sum, Avg, Max
# 총합, 평균, 최댓값 계산
result = Order.objects.aggregate(
total_amount=Sum('amount'),
average_amount=Avg('amount'),
max_amount=Max('amount')
)
print(result['total_amount'], result['average_amount'], result['max_amount'])
annotate()와 aggregate()의 차이점
특징 | annotate() | aggregate() |
---|---|---|
레벨 | 각 객체별 필드 추가 | 전체 쿼리셋에 대한 집계 결과 반환 |
결과 값 | 각 객체에 동적으로 추가된 필드 포함 | 단일 값 또는 사전 형태의 결과 반환 |
용도 | 개별 객체의 통계 정보 제공 | 전체 데이터셋에 대한 통계 제공 |
예를 들어:
annotate()
:1
Category.objects.annotate(post_count=Count('post'))
각 카테고리별 게시물 수를 반환.
aggregate()
:1
Category.objects.aggregate(total_posts=Count('post'))
전체 게시물 수를 반환.
주의할 점
- 결과 형태:
aggregate()
메서드는 항상 사전(dictionary) 형태로 결과를 반환합니다. - 집계 함수 지원 여부: 데이터베이스 엔진에 따라 지원되는 집계 함수가 다를 수 있습니다.
- 필드 이름 충돌: 결과의 키 이름은 명시적으로 지정하는 것이 좋습니다. 동일한 필드 이름을 사용할 경우 예상치 못한 충돌이 발생할 수 있습니다.
aggregate()의 장점
- 간편한 집계 계산: Python 코드로 복잡한 SQL 집계 함수를 쉽게 사용할 수 있습니다.
- 유연성: 여러 집계 함수와 결합하여 다양한 계산을 수행할 수 있습니다.
- 효율성: 데이터베이스 수준에서 집계를 수행하므로 성능이 뛰어납니다.
결론
Django ORM의 aggregate()
메서드는 쿼리셋 전체에 대한 통계나 집계를 처리하는 데 최적화된 도구입니다. 다양한 집계 함수를 활용하여 데이터를 분석하고 통계를 추출할 수 있으며, 간결하고 직관적인 코드로 복잡한 쿼리를 수행할 수 있습니다.