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 result contiene un set di query con due colonne: author e 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 result contiene un set di query con due colonne: author e total_price :

      author    | total_price
    ------------|-------------
     OneAuthor  |    100.35
    OtherAuthor |     50.00
        ...     |      ...
    


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow