Obtener lista de campos de una relación inversa.
Estoy tratando de obtener la lista de recuentos de un campo basado en la fecha para poder graficar un gráfico de barras apiladas en el frontend. Estos son mis modelos:
class BaseModel(models.Model):
id: int
created_at = models.DateTimeField(verbose_name="Creado", auto_now_add=True)
updated_at = models.DateTimeField(verbose_name="Última actualización", auto_now=True)
class Meta:
abstract = True
class A(BaseModel):
name = models.CharField(max_length=512, null=True, blank=True)
class B(BaseModel):
a = models.ForeignKey(A, on_delete=models.CASCADE)
class C(BaseModel):
b = models.ForeignKey(B, on_delete=models.CASCADE)
Estoy tratando de obtener el recuento (como lista) de B
y C
al obtener la lista de A
durante los últimos 7 días. Pero en cambio, estoy obteniendo el recuento en lugar de un objeto.
Utilizando recharts en el frontend, el formato de salida deseado será (utilizando datos de muestra de internet):
{
"items": [
{
"name": "aplicación de Android",
"chart_data": [
{
"name": "A",
"x": 12,
"y": 23,
"z": 122
},
{
"name": "B",
"x": 22,
"y": 3,
"z": 73
},
{
"name": "C",
"x": 13,
"y": 15,
"z": 32
}
]
},
{
"name": "My",
"chart_data": [
{
"name": "A",
"x": 12,
"y": 23,
"z": 122
},
{
"name": "B",
"x": 22,
"y": 3,
"z": 73
},
{
"name": "C",
"x": 13,
"y": 15,
"z": 32
}
]
}
]
}
davy.ai
Para obtener la cantidad de
B
yC
al obtener la lista deA
de los últimos 7 días, puedes usar el ORM de Django para realizar agregación y filtrado.Primero, puedes filtrar los objetos
BaseModel
para incluir solo aquellos creados en los últimos 7 días usando la consulta__gte
para el campocreated_at
. Luego, puedes usar las características de agregación de Django para agrupar los objetosB
yC
por sus claves foráneas aA
y contarlos.Aquí tienes un ejemplo de consulta para obtener las cuentas de objetos
B
yC
agrupados por sus respectivos objetosA
creados en los últimos 7 días:Esto devolverá un conjunto de resultados con
id
,nombre
,conteo_b
yconteo_c
para cada objetoA
creado en los últimos 7 días. Luego puedes usar estos datos para formatearlos en el formato de salida deseado para tu frontend.Para formatear los datos en el formato de salida deseado, puedes recorrer el conjunto de resultados y crear una lista de diccionarios para cada objeto
A
con elnombre
y los datos del gráfico (chart_data
) que contengan los conteos deB
yC
.Aquí tienes un ejemplo de código para formatear los datos en el formato de salida deseado:
Esto creará un diccionario
salida
que contiene una lista de elementos connombre
ychart_data
que puedes usar para representar el gráfico de barras apiladas en tu frontend usando recharts.