Django Aggregate в Python: агрегатные операции

В этом уроке вы узнаете, как использовать Django для получения агрегированных значений из базы данных, включая количество, минимум, максимум, сумму и среднее значение в Python.

Содержание

Подготовка данных

Для демонстрации мы будем использовать модели Employee и Department из приложения hr. Модели Employee и Department сопоставляются с таблицами hr_employee и hr_department:

Пример с моделями Employee и 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.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *