Django                
            Aggregazioni di modelli
        
        
            
    Ricerca…
introduzione
Le aggregazioni sono metodi che consentono l'esecuzione di operazioni su (singoli e / o gruppi di) righe di oggetti derivati da un modello.
Media, Minima, Massima, Somma da Queryset
class Product(models.Model):
    name = models.CharField(max_length=20)
    price = models.FloatField()
Per ottenere il prezzo medio di tutti i prodotti:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Per ottenere il prezzo minimo di tutti i prodotti:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Per ottenere il prezzo massimo di tutti i prodotti:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Per ottenere SUM dei prezzi di tutti i prodotti:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Conta il numero di relazioni estere
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)
Per ottenere il numero di prodotti per ogni categoria:
>>> categories = Category.objects.annotate(Count('product'))
 Aggiunge l'attributo <field_name>__count a ogni istanza restituita: 
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Puoi fornire un nome personalizzato per il tuo attributo utilizzando un argomento di parole chiave:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Puoi utilizzare il campo annotato in querysets:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB PER ... COUNT / SUM Equivalente di Django ORM
 Siamo in grado di eseguire un GROUP BY ... COUNT o un GROUP BY ... SUM query SQL equivalenti sui Django ORM, con l'uso di annotate() , values() , order_by() e le django.db.models s' Count e Sum metodi rispettosamente: 
Lascia che il nostro modello sia:
   class Books(models.Model):
       title  = models.CharField()
       author = models.CharField()
       price = models.FloatField()
 GROUP BY ... COUNT : 
- Supponiamo che vogliamo contare quanti oggetti libro per autore distinto esistono nella nostra tabella - Books:- result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
- Ora il - resultcontiene un set di query con due colonne:- authore- count:- author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
 GROUB BY ... SUM : 
- Supponiamo che vogliamo sommare il prezzo di tutti i libri per autore distinto presenti nella nostra tabella - Books:- result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
- Ora il - resultcontiene un set di query con due colonne:- authore- total_price:- author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...