Django Aggregate в Python: агрегатные операции
В этом уроке вы узнаете, как использовать Django для получения агрегированных значений из базы данных, включая количество, минимум, максимум, сумму и среднее значение в Python.
Подготовка данных
Для демонстрации мы будем использовать модели Employee и Department из приложения hr. Модели Employee и Department сопоставляются с таблицами hr_employee и hr_department:
Чтобы начать обучение, вы можете выполнить следующие шаги:
- Сначала добавьте поле зарплаты в модель Employee:
class Employee(models.Model): salary = models.DecimalField(max_digits=15, decimal_places=2) # ...
- Во-вторых, выполните миграции с помощью команды makemigrations:
python manage.py makemigrations
Выход:
Migrations for 'hr': hr\migrations\0005_employee_salary.py - Add field salary to employee
- В-третьих, распространите изменения в базе данных, выполнив команду миграции:
python manage.py migrate
Выход:
Operations to perform: Apply all migrations: admin, auth, contenttypes, hr, sessions Running migrations: Applying hr.0005_employee_salary... OK
- Наконец, заполните столбец «salary» (зарплата) данными из фикстуры data.json:
python manage.py loaddata data.json
Введение в Django aggregate
Агрегатная функция принимает список значений и возвращает одно значение. Обычно используемые агрегатные функции — это count, max, min, avg и sum.
Count
Объект QuerySet предоставляет вам метод count(), который возвращает количество содержащихся в нем объектов. Например, вы можете использовать метод count(), чтобы получить количество сотрудников:
>>> Employee.objects.count() SELECT COUNT(*) AS "__count" FROM "hr_employee" Execution time: 0.002160s [Database: default] 220
Метод count() использует функцию SQL COUNT(*) для возврата количества строк в таблице hr_employee.
Чтобы получить количество сотрудников, чьи имена начинаются с буквы J, вы можете использовать оба метода filter() и count() объекта QuerySet следующим образом:
>>> Employee.objects.filter(first_name__startswith='J').count() SELECT COUNT(*) AS "__count" FROM "hr_employee" WHERE "hr_employee"."first_name"::text LIKE 'J%' Execution time: 0.000000s [Database: default] 29
В этом случае метод filter() формирует предложение WHERE, а метод count() формирует функцию COUNT().
Max
Max() возвращает максимальное значение в наборе значений. Он принимает столбец, для которого вы хотите получить наибольшее значение.
Например, следующий код использует Max() для возврата самой высокой зарплаты:
>>> Employee.objects.aggregate(Max('salary')) SELECT MAX("hr_employee"."salary") AS "salary__max" FROM "hr_employee" Execution time: 0.002001s [Database: default] {'salary__max': Decimal('248312.00')}
Max() выполняет SQL MAX() для столбца зарплаты таблицы hr_employee и возвращает самую высокую зарплату.
Min
Min() возвращает минимальное значение в наборе значений. Как и Max(), он принимает столбец, в котором вы хотите получить наименьшее значение.
В следующем примере функция Min() используется для возврата самой низкой зарплаты сотрудников:
>>> Employee.objects.aggregate(Min('salary')) SELECT MIN("hr_employee"."salary") AS "salary__min" FROM "hr_employee" Execution time: 0.002015s [Database: default] {'salary__min': Decimal('40543.00')}
Функция Min() выполняет функцию SQL MIN(), которая возвращает минимальное значение в столбце зарплаты.
Avg
Avg() возвращает среднее значение в наборе значений. Он принимает имя столбца и возвращает среднее значение всех значений в этом столбце:
>>> Employee.objects.aggregate(Avg('salary')) SELECT AVG("hr_employee"."salary") AS "salary__avg" FROM "hr_employee" Execution time: 0.005468s [Database: default] {'salary__avg': Decimal('137100.490909090909')}
В фоновом режиме Avg() выполняет функцию SQL AVG() для столбца зарплаты hr_employee и возвращает среднюю зарплату.
Sum
Sum() возвращает сумму значений. Например, вы можете использовать Sum() для расчета общей зарплаты компании:
>>> Employee.objects.aggregate(Sum('salary')) SELECT SUM("hr_employee"."salary") AS "salary__sum" FROM "hr_employee" Execution time: 0.000140s [Database: default] {'salary__sum': Decimal('30162108.00')}
Sum() выполняет функцию SQL SUM() и возвращает общее значение всех значений в столбце зарплаты таблицы hr_employee.