Django
Agregacje modelowe
Szukaj…
Wprowadzenie
Agregacje są metodami umożliwiającymi wykonywanie operacji na (pojedynczych i / lub grupach) rzędów obiektów pochodzących z Modelu.
Średnia, minimalna, maksymalna, suma z zestawu zapytań
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Aby uzyskać średnią cenę wszystkich produktów:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Aby uzyskać cenę minimalną wszystkich produktów:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Aby uzyskać maksymalną cenę wszystkich produktów:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Aby uzyskać SUM cen wszystkich produktów:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Policz liczbę stosunków zagranicznych
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)
Aby uzyskać liczbę produktów dla każdej kategorii:
>>> categories = Category.objects.annotate(Count('product'))
Dodaje to atrybut <field_name>__count
do każdej zwróconej instancji:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Możesz podać niestandardową nazwę dla swojego atrybutu, używając argumentu słowa kluczowego:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Możesz użyć pola z adnotacjami w zestawach zapytań:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GRUB BY ... COUNT / SUM Odpowiednik Django ORM
Możemy wykonać GROUP BY ... COUNT
lub GROUP BY ... SUM
SQL równoważne zapytania dotyczące Django ORM, z wykorzystaniem annotate()
, values()
, order_by()
i django.db.models
„s Count
i Sum
metody z szacunkiem:
Niech nasz model będzie:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Załóżmy, że chcemy policzyć, ile obiektów książki dla poszczególnych autorów istnieje w naszej tabeli
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Teraz
result
zawiera zestaw zapytań z dwiema kolumnami:author
icount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Załóżmy, że chcemy zsumować cenę wszystkich książek poszczególnych autorów, które istnieją w naszej tabeli
Books
:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Teraz
result
zawiera zestaw zapytań z dwiema kolumnami:author
i cenatotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...