Django
Modelaggregaties
Zoeken…
Invoering
Aggregaties zijn methoden waarmee bewerkingen kunnen worden uitgevoerd op (individuele en / of groepen van) rijen objecten afgeleid van een model.
Gemiddeld, Minimum, Maximum, Som van Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Om de gemiddelde prijs van alle producten te krijgen:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Om de minimumprijs van alle producten te krijgen:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Om de maximale prijs van alle producten te krijgen:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Om SOM van prijzen van alle producten te krijgen:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Tel het aantal buitenlandse relaties
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)
Om het aantal producten voor elke categorie te krijgen:
>>> categories = Category.objects.annotate(Count('product'))
Hiermee wordt het <field_name>__count
aan elke geretourneerde instantie:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
U kunt een aangepaste naam voor uw kenmerk opgeven door een trefwoordargument te gebruiken:
>>> categories = Category.objects.annotate(num_products=Count('product'))
U kunt het geannoteerde veld in querysets gebruiken:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB PER ... COUNT / SOM Django ORM equivalent
We kunnen uitvoeren GROUP BY ... COUNT
of een GROUP BY ... SUM
SQL gelijkwaardig vragen over Django ORM, met het gebruik van annotate()
, values()
, order_by()
en de django.db.models
's Count
en Sum
methoden respectvol:
Laat ons model zijn:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Laten we aannemen dat we willen tellen hoeveel boekobjecten per afzonderlijke auteur er in onze
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Het
result
bevat nu een queryset met twee kolommen:author
encount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Laten we aannemen dat we de prijs willen optellen van alle boeken per auteur die in onze
Books
voorkomt:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Het
result
bevat nu een queryset met twee kolommen:author
entotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...