Group by con el ORM de Django
Igor Támara
Senior Software EngineerDespués de llevar años usando bases de datos relacionales y acostumbrado a sentencias que contienen agregaciones como sum, avg, max, min, u otras más interesantes como string_agg de postgresql, se llega al ORM de Django y los clientes requieren consultas que involucran este tipo de características. Aunque está documentado, en esta entrada vamos a mostrar las dos técnicas para hacerlo en los casos más comunes, el primero, cuando la agregación se va a hacer sobre un modelo que tiene una llave foránea y otro agregando campos sobre el mismo modelo.
Para los ejemplos, vamos a tener en cuenta los siguientes modelos:
Agregaciones" class="redactor-autoparser-object">https://gist.github.com/377577... sobre el mismo modelo
Las funciones a usar sobre el conjunto de objetos son aggregate y annotate. La referencia completa de funciones de agregación que sería usable está en https://docs.djangoproject.com/en/dev/ref/models/querysets/#aggregation-functions
A continuación ejemplos con consultas comunes sobre los modelos previamente mostrados
Cabe" class="redactor-autoparser-object">https://gist.github.com/377596... notar que hemos usado annotate, esta función emplea la capacidad del SMBD subyacente de forma que no se hacen consultas e iteraciones sobre cada producto para la totalización.
El efecto de annotate es adicionar a cada uno de los elementos del queryset de respuesta, en el caso particular, se puede acceder vía el atributo sale_by_email.
Agregaciones que involucran llaves foráneas
Vamos a ayudarnos del related_name para hacer anotación de cuántos productos se solicitaron por venta.
Como" class="redactor-autoparser-object">https://gist.github.com/377611... se puede observar, se está accediendo a los atributos en CartProduct, específicamente a quantity para hacer la sumatoria.
Cuando las agregaciones no son suficientes
Lo que usualmente se querría hacer es totalizar la venta, es decir, multiplicar el valor del producto de la venta por la cantidad que se compraron y hacer la suma sobre este producto. Al final se puede hacer fallback a las consultas raw de la base de datos.
Esta fue una pequeña introducción que vale la pena continuar en la documentación oficial de Django.
Referencias
Written by Igor Támara
A seasoned developer, Igor brings expertise in designing and building complex software systems. With a focus on quality and performance, they lead projects that drive innovation and deliver reliable solutions to meet user needs.