Класс Avg
Класс Avg применяется в методах aggregate и annotate для вычисления среднего значения указанного поля. Он возвращает объект класса Avg, который можно использовать в запросах к базе данных для получения статистической информации о числовых полях. Класс принимает аргумент - имя поля, по которому необходимо вычислить среднее, а также может принимать дополнительные параметры, такие как filter для применения условий к агрегации.
Синтаксис
from django.db.models import Avg
Model.objects.aggregate(Avg('field_name'))
Model.objects.annotate(avg_value=Avg('field_name'))
Пример
Вычислим среднюю цену всех товаров в магазине:
from django.db.models import Avg
from myapp.models import Product
res = Product.objects.aggregate(Avg('price'))
print(res)
Результат выполнения кода:
{"price__avg": 245.75}
Пример
Применим агрегацию с условием, вычислив среднюю цену только товаров с рейтингом выше 4:
from django.db.models import Avg, Q
from myapp.models import Product
res = Product.objects.filter(rating__gt=4).aggregate(Avg('price'))
print(res)
Результат выполнения кода:
{"price__avg": 312.50}
Пример
Используем annotate для добавления среднего значения к каждому объекту в QuerySet. Например, вычислим средний возраст пользователей в каждой категории:
from django.db.models import Avg
from myapp.models import Category, User
res = Category.objects.annotate(
avg_age=Avg('users__age')
).values('name', 'avg_age')
print(res)
Результат выполнения кода:
[{"name": "category1", "avg_age": 25.5}, {"name": "category2", "avg_age": 30.0}]
Пример
Применим условную агрегацию с использованием параметра filter, чтобы вычислить среднюю цену только для активных товаров:
from django.db.models import Avg, Q
from myapp.models import Product
res = Product.objects.aggregate(
avg_active_price=Avg('price', filter=Q(is_active=True))
)
print(res)
Результат выполнения кода:
{"avg_active_price": 180.25}