Метод aggregate

Метод aggregate применяется к QuerySet и возвращает словарь с вычисленными агрегатными значениями. Он выполняет SQL-запрос с агрегирующими функциями над полями модели. Метод принимает именованные аргументы, где ключ - это имя результата, а значение - экземпляр класса агрегации. Метод не изменяет исходный QuerySet и вычисляет значения непосредственно в базе данных.

Синтаксис

pythonfrom django.db.models import Sum, Avg, Count, Max, Min

result = Model.objects.aggregate(aggregate_name=AggregateFunction('field'))

Пример . С суммой

Давайте вычислим общее количество просмотров всех статей:

pythonfrom myapp.models import Article
from django.db.models import Sum

res = Article.objects.aggregate(total_views=Sum('views_count'))
print(res)

Результат выполнения кода:

python{"total_views": 1250}

Пример . Со средним значением

Рассчитаем среднюю оценку всех книг:

pythonfrom myapp.models import Book
from django.db.models import Avg

res = Book.objects.aggregate(average_rating=Avg('rating'))
print(res)

Результат выполнения кода:

python{"average_rating": 4.5}

Пример . С максимальным значением

Найдем максимальную цену товара:

pythonfrom myapp.models import Product
from django.db.models import Max

res = Product.objects.aggregate(max_price=Max('price'))
print(res)

Результат выполнения кода:

python{"max_price": 999.99}

Пример . С минимальным значением

Найдем минимальную цену товара:

pythonfrom myapp.models import Product
from django.db.models import Min

res = Product.objects.aggregate(min_price=Min('price'))
print(res)

Результат выполнения кода:

python{"min_price": 99.99}

Пример . С количеством записей

Подсчитаем общее количество опубликованных статей:

pythonfrom myapp.models import Article
from django.db.models import Count

res = Article.objects.filter(status='published').aggregate(total_articles=Count('id'))
print(res)

Результат выполнения кода:

python{"total_articles": 15}

Пример . С несколькими агрегациями

Вычислим одновременно сумму, среднее, минимум и максимум для поля цены:

pythonfrom myapp.models import Product
from django.db.models import Sum, Avg, Max, Min

res = Product.objects.aggregate(
  total_sum=Sum('price'),
  average_price=Avg('price'),
  max_price=Max('price'),
  min_price=Min('price')
)
print(res)

Результат выполнения кода:

python{"total_sum": 15000.50, "average_price": 250.01, "max_price": 999.99, "min_price": 49.99}

Пример . С фильтрацией перед агрегацией

Вычислим сумму просмотров только для опубликованных статей:

pythonfrom myapp.models import Article
from django.db.models import Sum

res = Article.objects.filter(status='published').aggregate(published_views=Sum('views_count'))
print(res)

Результат выполнения кода:

python{"published_views": 980}

Смотрите также

  • метод annotate,
    который добавляет агрегированные значения к каждому объекту QuerySet
  • класс Count,
    который используется для подсчета количества записей
  • класс Sum,
    который используется для вычисления суммы значений
  • класс Avg,
    который используется для вычисления среднего значения