Consulta como GROUP BY en Django
-
Crear una consulta
GROUP BY
en Django -
Utilice agregaciones múltiples con la consulta
GROUP BY
-
Registros
GROUP BY
con varias columnas - Filtrar registros de cada grupo
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:
values()
- Reemplaza la cláusulaGROUP BY
de la consulta SQL. Sea cual sea la columna que estemos usando con la cláusulaGROUP BY
en la consulta SQL que tenemos que usar como argumentos del métodovalues()
.anotar()
- El métodoanotar()
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:
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:
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:
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.