Django
Agrégations de modèles
Recherche…
Introduction
Les agrégations sont des méthodes permettant l'exécution d'opérations sur des lignes (individuelles et / ou des groupes) d'objets dérivés d'un modèle.
Moyenne, Minimum, Maximum, Somme de Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Obtenir le prix moyen de tous les produits:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Pour obtenir le prix minimum de tous les produits:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Pour obtenir le prix maximum de tous les produits:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Pour obtenir la somme des prix de tous les produits:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Compter le nombre de relations étrangères
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)
Pour obtenir le nombre de produits pour chaque catégorie:
>>> categories = Category.objects.annotate(Count('product'))
Cela ajoute l' <field_name>__count
à chaque instance renvoyée:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Vous pouvez fournir un nom personnalisé pour votre attribut en utilisant un argument de mot-clé:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Vous pouvez utiliser le champ annoté dans les jeux de requêtes:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB BY ... COUNT / SUM Django équivalent ORM
Nous pouvons effectuer une GROUP BY ... COUNT
ou un GROUP BY ... SUM
requêtes SQL équivalent sur Django ORM, avec l'utilisation de annotate()
, les values()
, order_by()
et les django.db.models
s » Count
et Sum
méthodes respectueusement:
Laissez notre modèle être:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Supposons que nous voulons compter le nombre d'objets du livre par auteur distinct dans notre tableau
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Le
result
contient maintenant un jeu de requête avec deux colonnes:author
etcount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Supposons que nous voulons faire la somme du prix de tous les livres par auteur distinct qui existent dans notre tableau
Books
:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Maintenant, le
result
contient un ensemble de requêtes avec deux colonnes:author
ettotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...