Post

Django ORM의 aggregate(): 쿼리셋 데이터 집계와 통계를 간편하게 처리하는 방법

aggregate() 메서드를 활용해 쿼리셋의 데이터를 집계하고 통계를 추출하는 방법

Django ORM의 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. MaxMin

최댓값과 최솟값을 계산합니다.

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'))
    

    전체 게시물 수를 반환.

주의할 점

  1. 결과 형태: aggregate() 메서드는 항상 사전(dictionary) 형태로 결과를 반환합니다.
  2. 집계 함수 지원 여부: 데이터베이스 엔진에 따라 지원되는 집계 함수가 다를 수 있습니다.
  3. 필드 이름 충돌: 결과의 키 이름은 명시적으로 지정하는 것이 좋습니다. 동일한 필드 이름을 사용할 경우 예상치 못한 충돌이 발생할 수 있습니다.

aggregate()의 장점

  1. 간편한 집계 계산: Python 코드로 복잡한 SQL 집계 함수를 쉽게 사용할 수 있습니다.
  2. 유연성: 여러 집계 함수와 결합하여 다양한 계산을 수행할 수 있습니다.
  3. 효율성: 데이터베이스 수준에서 집계를 수행하므로 성능이 뛰어납니다.

결론

Django ORM의 aggregate() 메서드는 쿼리셋 전체에 대한 통계나 집계를 처리하는 데 최적화된 도구입니다. 다양한 집계 함수를 활용하여 데이터를 분석하고 통계를 추출할 수 있으며, 간결하고 직관적인 코드로 복잡한 쿼리를 수행할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.