Group by con el ORM de Django

IT Igor Támara Igor Támara

Igor Támara

Senior Software Engineer
1 min read.

Despué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

IT Igor Támara 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.

Newsletter

Subscribe to our newsletter:

Read more

Primeros pasos con Compass

Después de haber hablado en una pasada oportunidad de Saas es bueno ver cual sería el siguiente paso después de aprender esta...

2 min read.

Crear template tags en django

Esta es una entrada un tanto básica, pero, muchas veces hemos estado en esas situaciones donde tenemos un problema por algo q...

1 min read.

Build Once. Own Forever.