Для вычисления количества объектов у QuerySet применяется метод count() и его асинхронная версия acount():
from .models import Person number = Person.objects.count() print(number)
На уровне базы данных метод транслируется в SQL-выражение SELECT COUNT(*)
В Django для подсчета количества объектов также может использоваться функция len(). В нее передается QuerySet, для которого надо вычислить количество объектов.
from .models import Person people = Person.objects.all() number = len(people) # количество объектов в наборе people print(number)
Что использовать: count или len? Если объекты уже ранее были загружены (например, с помощью метода all()
), то оптимальнее использовать функцию
len()
, которая не выполняет к базе данных запрос SQL, а работает с уже загруженным набором объектов.
Если же объекты ранее НЕ были загружены, то лучше выполнить метод count()
, для которого не потребуется загружать все объекты из бд.
Агрегатные операции позволяют получить одно скалярное значение, подсчитанное на наборе данных по определенному критерию. Для выполнения агрегатных операций применяется метод aggregate, который принимает один из объектов следующих классов:
Avg: вычисляет среднее значение
Min: вычисляет минимальное значение
Max: вычисляет максимальное значение
Sum: вычисляет сумму
В качестве одного из параметров конструкторы этих классов принимают выражение - обычно свойство, по которому вычисляется значение:
from .models import Person from django.db.models import Avg, Min, Max, Sum # средний возраст avg_age = Person.objects.aggregate(Avg("age")) print(avg_age) # минимальный возраст min_age = Person.objects.aggregate(Min("age")) print(min_age) # максимальный возраст max_age = Person.objects.aggregate(Max("age")) print(max_age) # сумма всех возрастов sum = Person.objects.aggregate(Sum("age")) print(sum)