Django
Модельные агрегации
Поиск…
Вступление
Агрегации - это методы, позволяющие выполнять операции над (индивидуальными и / или группами) строк объектов, полученных из Модели.
Среднее, Минимальное, Максимальное, Сумма от Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Получить среднюю цену всех продуктов:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Чтобы получить минимальную цену для всех продуктов:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Получить максимальную цену для всех продуктов:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Чтобы получить СУММУ всех продуктов:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Подсчитайте количество внешних связей
class Category(models.Model):
name = models.CharField(max_length=20)
class Product(models.Model):
name = models.CharField(max_length=64)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
Чтобы получить число продуктов для каждой категории:
>>> categories = Category.objects.annotate(Count('product'))
Это добавляет атрибут <field_name>__count
для каждого возвращаемого экземпляра:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Вы можете указать собственное имя для своего атрибута, используя аргумент ключевого слова:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Вы можете использовать аннотированное поле в запросах:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB BY ... COUNT / SUM эквивалент Django ORM
Мы можем выполнить GROUP BY ... COUNT
или через GROUP BY ... SUM
SQL эквивалентных запросов на Django ORM, с использованием annotate()
, values()
, order_by()
и django.db.models
«S Count
и Sum
методы с уважением:
Пусть наша модель будет:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Предположим, что мы хотим подсчитать, сколько книжных объектов на отдельный автор существует в нашей таблице «
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Теперь
result
содержит набор запросов с двумя столбцами:author
иcount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Предположим, что мы хотим суммировать цену всех книг для отдельного автора, которые существуют в нашей таблице «
Books
:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Теперь
result
содержит набор запросов с двумя столбцами:author
иtotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...