Django
Agregaciones de modelos
Buscar..
Introducción
Las agregaciones son métodos que permiten la ejecución de operaciones en (individuales y / o grupos de) filas de objetos derivados de un Modelo.
Promedio, mínimo, máximo, suma de Queryset
class Product(models.Model):
name = models.CharField(max_length=20)
price = models.FloatField()
Para obtener el precio promedio de todos los productos:
>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}
Para obtener el precio mínimo de todos los productos:
>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}
Para obtener el precio máximo de todos los productos:
>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }
Para obtener SUMA de precios de todos los productos:
>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }
Cuenta el número de relaciones exteriores.
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)
Para obtener el número de productos para cada categoría:
>>> categories = Category.objects.annotate(Count('product'))
Esto agrega el atributo <field_name>__count
a cada instancia devuelta:
>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]
Puede proporcionar un nombre personalizado para su atributo utilizando un argumento de palabra clave:
>>> categories = Category.objects.annotate(num_products=Count('product'))
Puede utilizar el campo anotado en querysets:
>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]
>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]
GROUB BY ... COUNT / SUM Django ORM equivalente
Podemos realizar un GROUP BY ... COUNT
o un GROUP BY ... SUM
consultas SQL equivalentes en ORM de Django, con el uso de annotate()
, values()
, order_by()
y los django.db.models
's Count
y Sum
respetuosamente los métodos:
Deja que nuestro modelo sea:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
GROUP BY ... COUNT
:
Supongamos que queremos contar cuántos objetos de libros por autor distinto existen en nuestra tabla de
Books
:result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
Ahora el
result
contiene un queryset con dos columnas:author
ycount
:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
GROUB BY ... SUM
:
Supongamos que queremos sumar el precio de todos los libros por autor distinto que existe en nuestra tabla de
Books
:result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))
Ahora el
result
contiene un queryset con dos columnas:author
ytotal_price
:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...