Метод aggregate
Метод aggregate применяется к QuerySet и возвращает словарь с вычисленными агрегатными значениями. Он выполняет SQL-запрос с агрегирующими функциями над полями модели. Метод принимает именованные аргументы, где ключ - это имя результата, а значение - экземпляр класса агрегации. Метод не изменяет исходный QuerySet и вычисляет значения непосредственно в базе данных.
Синтаксис
from django.db.models import Sum, Avg, Count, Max, Min
result = Model.objects.aggregate(aggregate_name=AggregateFunction('field'))
Пример . С суммой
Давайте вычислим общее количество просмотров всех статей:
from myapp.models import Article
from django.db.models import Sum
res = Article.objects.aggregate(total_views=Sum('views_count'))
print(res)
Результат выполнения кода:
{"total_views": 1250}
Пример . Со средним значением
Рассчитаем среднюю оценку всех книг:
from myapp.models import Book
from django.db.models import Avg
res = Book.objects.aggregate(average_rating=Avg('rating'))
print(res)
Результат выполнения кода:
{"average_rating": 4.5}
Пример . С максимальным значением
Найдем максимальную цену товара:
from myapp.models import Product
from django.db.models import Max
res = Product.objects.aggregate(max_price=Max('price'))
print(res)
Результат выполнения кода:
{"max_price": 999.99}
Пример . С минимальным значением
Найдем минимальную цену товара:
from myapp.models import Product
from django.db.models import Min
res = Product.objects.aggregate(min_price=Min('price'))
print(res)
Результат выполнения кода:
{"min_price": 99.99}
Пример . С количеством записей
Подсчитаем общее количество опубликованных статей:
from myapp.models import Article
from django.db.models import Count
res = Article.objects.filter(status='published').aggregate(total_articles=Count('id'))
print(res)
Результат выполнения кода:
{"total_articles": 15}
Пример . С несколькими агрегациями
Вычислим одновременно сумму, среднее, минимум и максимум для поля цены:
from 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)
Результат выполнения кода:
{"total_sum": 15000.50, "average_price": 250.01, "max_price": 999.99, "min_price": 49.99}
Пример . С фильтрацией перед агрегацией
Вычислим сумму просмотров только для опубликованных статей:
from myapp.models import Article
from django.db.models import Sum
res = Article.objects.filter(status='published').aggregate(published_views=Sum('views_count'))
print(res)
Результат выполнения кода:
{"published_views": 980}