Django
Model Aggregations
Sök…
Introduktion
Aggregeringar är metoder som tillåter exekvering av operationer på (enskilda och / eller grupper av) rader av objekt som härrör från en modell.
Genomsnitt, Minimum, Maximum, Summa från Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
För att få medelpris för alla produkter:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
För att få minimipris för alla produkter:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
För att få maximalt pris på alla produkter:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
För att få SUM av priser på alla produkter:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Räkna antalet utrikesrelationer
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)
Så här får du antalet produkter för varje kategori:
>>> categories = Category.objects.annotate(Count('product'))
Detta lägger till <field_name>__count
attributet till varje returnerad instans:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Du kan ange ett anpassat namn för ditt attribut genom att använda ett sökordargument:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Du kan använda det kommenterade fältet i frågeställningar:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB BY ... COUNT / SUM Django ORM-ekvivalent
Vi kan utföra en GROUP BY ... COUNT
eller en GROUP BY ... SUM
SQL-ekvivalenta frågor på Django ORM, med användning av annotate()
, values()
, order_by()
och django.db.models
' Count
och Sum
metoder respektfullt:
Låt vår modell vara:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Låt oss anta att vi vill räkna hur många bokobjekt per särskild författare som finns i vår
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Nu innehåller
result
en frågeställning med två kolumner:author
ochcount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Låt oss anta att vi vill summera priset för alla böcker per distinkt författare som finns i vår
Books
:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Nu innehåller
result
en frågeställning med två kolumner:author
ochtotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...