Consulta como GROUP BY en Django

Shubham Vora 15 febrero 2024
  1. Crear una consulta GROUP BY en Django
  2. Utilice agregaciones múltiples con la consulta GROUP BY
  3. Registros GROUP BY con varias columnas
  4. Filtrar registros de cada grupo
Consulta como GROUP BY en Django

La mayoría de ustedes está familiarizado con SQL y sabe cómo escribir consultas SQL utilizando la cláusula GROUP BY para obtener datos en grupos. Con la cláusula GROUP BY, podemos crear un grupo de registros en función de los valores de una o varias columnas y realizar una función de agregación.

En este artículo, supondremos que estamos trabajando en la base de datos Bike, que contiene Bike_id, Bike_name, Bike_brand, Bike_color, Bike_bought_date, Is_bike_premium, Bike_price, etc. .

Aprenderemos a realizar diferentes operaciones con la cláusula GROUP BY en la base de datos Bike anterior. Además, primero escribiremos consultas SQL usando la cláusula GROUP BY y la convertiremos a Python para que los lectores puedan entender fácilmente y aprender a escribir consultas en Django rápidamente.

Crear una consulta GROUP BY en Django

Supongamos que queremos contar el número de bicicletas según su color. En términos simples, queremos hacer un grupo de bicicletas según sus colores, y para eso, hemos escrito la consulta SQL a continuación.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
GROUP BY
    Bike_color

Como resultado de la consulta SQL anterior, obtendremos 2 columnas. Uno es Bike_color, y otro es Total_Bikes, que representa el número de bicicletas de un determinado color.

Ahora, convertiremos la consulta SQL anterior a código Python para obtener el mismo resultado.

from django.db.models import Count

Bike.objects.values("Bike_color").annotate(Total_bikes=Count("Bike_id"))

Producción:

crear django groupby

  1. values() - Reemplaza la cláusula GROUP BY de la consulta SQL. Sea cual sea la columna que estemos usando con la cláusula GROUP BY en la consulta SQL que tenemos que usar como argumentos del método values().
  2. anotar() - El método anotar() toma la función agregada como argumento para aplicar a cada grupo.

De esta forma, podemos hacer un grupo de bicicletas según su color y contar el número de bicicletas del mismo color usando la consulta de Python.

Si los usuarios llaman a la función anotar() antes de valores(), no aplicará la función agregada en la fila de grupos sino en todo el registro. Por lo tanto, asegúrese del orden de los métodos que utiliza al escribir consultas.

Utilice agregaciones múltiples con la consulta GROUP BY

Aquí haremos un grupo de bicicletas según su color. Después de eso, usaremos la función de agregación Count() para contar bicicletas de cada color y la función de agregación Min() para obtener una bicicleta con el costo mínimo de cada grupo.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes,
    MIN(Bike_price) As cheap_bike
FROM
    Bike
GROUP BY
    Bike_color

A continuación, hemos convertido la consulta SQL anterior en código Python.

from django.db.models import Count
from django.db.models import Min

Bike.objects.values("Bike_color").annotate(
    Total_bikes=Count("Bike_id"), cheap_bike=Min("Bike_price")
)

Producción:

django groupby multiple

De esta forma, hemos utilizado las funciones de agregado múltiple Count() y Min() con la consulta group by en Python.

Registros GROUP BY con varias columnas

En la siguiente consulta SQL, hemos utilizado los campos Bike_color y Is_bike_premium con la cláusula GROUP BY. La consulta agrupará los registros según su color y si están en una categoría premium.

SELECT
    Bike_color,
    Is_bike_premium,
    COUNT(Bike_id) AS Total_bikes,
FROM
    Bike
GROUP BY
    Bike_color,
    Is_bike_premium

Debemos agregar múltiples campos dentro del método valores () para convertir la consulta SQL anterior al código de Python.

from django.db.models import Count

Bike.objects.values("Bike_color", "Is_bike_premium").annotate(
    Total_bikes=Count("Bike_id")
)

Producción:

django groupby múltiples columnas

Filtrar registros de cada grupo

En esta sección, haremos grupos de todos los registros de la tabla Bicicleta según su color y filtraremos todas las bicicletas no premium de cada grupo. En términos simples, haremos un grupo de bicicletas no premium según su color.

Hemos utilizado la cláusula WHERE en la siguiente consulta SQL para filtrar las bicicletas.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
WHERE
    Is_bike_premium = False
GROUP BY
    Bike_color

Para convertir la consulta SQL anterior a un código de Python, hemos utilizado el método filter() de Python y hemos pasado la condición de filtrado como argumento.

from django.db.models import Count

Bike.objects.values("Bike_color").filter(Is_bike_premium=False).annotate(
    Total_bikes=Count("Bike_id")
)

Producción:

filtro de grupo django

Hemos aprendido a crear consultas GROUP BY en Django en este artículo. Además, hemos visto los diferentes casos de uso de las consultas agrupar por.

Además, los usuarios pueden utilizar las consultas agrupar por con el método orderBy() para ordenar los registros de cada grupo.

Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub

Artículo relacionado - Django SQL