Django
Modellaggregationen
Suche…
Einführung
Aggregationen sind Methoden, die die Ausführung von Operationen an (einzelnen und / oder Gruppen von) Objektzeilen ermöglichen, die von einem Modell abgeleitet werden.
Durchschnitt, Minimum, Maximum, Summe aus Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Durchschnittspreis aller Produkte erhalten:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Mindestpreis aller Produkte erhalten:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Maximalpreis aller Produkte erhalten:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
SUM von Preisen aller Produkte erhalten:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Zählen Sie die Anzahl der Auslandsbeziehungen
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)
So erhalten Sie die Anzahl der Produkte für jede Kategorie:
>>> categories = Category.objects.annotate(Count('product'))
Dadurch wird das <field_name>__count
Attribut zu jeder zurückgegebenen Instanz <field_name>__count
:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Sie können einen benutzerdefinierten Namen für Ihr Attribut angeben, indem Sie ein Schlüsselwortargument verwenden:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Sie können das annotierte Feld in Abfragesets verwenden:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB BY ... COUNT / SUM Äquivalent zu Django ORM
Wir können eine durchführen GROUP BY ... COUNT
oder eine GROUP BY ... SUM
SQL - Abfragen auf äquivalente Django ORM, mit der Verwendung von annotate()
, values()
, order_by()
und die django.db.models
‚s Count
und Sum
Methoden respektvoll:
Lass unser Modell sein:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Nehmen wir an, wir wollen zählen, wie viele Buchobjekte pro Autor in unserer Tabelle
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Das
result
enthält nun ein Abfrageset mit zwei Spalten:author
undcount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Nehmen wir an, wir wollen den Preis aller Bücher pro Autor, die in unserer
Books
Tabelle vorhanden sind, zusammenfassen:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Das
result
enthält nun ein Abfrageset mit zwei Spalten:author
undtotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...