Szukaj…


Wprowadzenie

Agregacje są metodami umożliwiającymi wykonywanie operacji na (pojedynczych i / lub grupach) rzędów obiektów pochodzących z Modelu.

Średnia, minimalna, maksymalna, suma z zestawu zapytań

class Product(models.Model):
    name = models.CharField(max_length=20)
    price = models.FloatField()

Aby uzyskać średnią cenę wszystkich produktów:

>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}

Aby uzyskać cenę minimalną wszystkich produktów:

>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}

Aby uzyskać maksymalną cenę wszystkich produktów:

>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }

Aby uzyskać SUM cen wszystkich produktów:

>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }

Policz liczbę stosunków zagranicznych

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)

Aby uzyskać liczbę produktów dla każdej kategorii:

>>> categories = Category.objects.annotate(Count('product'))

Dodaje to atrybut <field_name>__count do każdej zwróconej instancji:

>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]

Możesz podać niestandardową nazwę dla swojego atrybutu, używając argumentu słowa kluczowego:

>>> categories = Category.objects.annotate(num_products=Count('product'))

Możesz użyć pola z adnotacjami w zestawach zapytań:

>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]

>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]

GRUB BY ... COUNT / SUM Odpowiednik Django ORM

Możemy wykonać GROUP BY ... COUNT lub GROUP BY ... SUM SQL równoważne zapytania dotyczące Django ORM, z wykorzystaniem annotate() , values() , order_by() i django.db.models „s Count i Sum metody z szacunkiem:

Niech nasz model będzie:

   class Books(models.Model):
       title  = models.CharField()
       author = models.CharField()
       price = models.FloatField()

GROUP BY ... COUNT :

  • Załóżmy, że chcemy policzyć, ile obiektów książki dla poszczególnych autorów istnieje w naszej tabeli Books :

    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    
  • Teraz result zawiera zestaw zapytań z dwiema kolumnami: author i count :

      author    | count
    ------------|-------
     OneAuthor  |   5
    OtherAuthor |   2
       ...      |  ...
    

GROUB BY ... SUM :

  • Załóżmy, że chcemy zsumować cenę wszystkich książek poszczególnych autorów, które istnieją w naszej tabeli Books :

     result = Books.objects.values('author')
                           .order_by('author')
                           .annotate(total_price=Sum('price'))
    
  • Teraz result zawiera zestaw zapytań z dwiema kolumnami: author i cena total_price :

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow