El ORM en Django nos permite anotar fácilmente (agregar campos) conjuntos de consultas basados en datos relacionados, sin embargo, no puedo encontrar la manera de obtener múltiples anotaciones para diferentes subconjuntos filtrados de datos relacionados.Datos pivotantes y anotaciones complejas en Django ORM
Esto se está preguntando en relación con django-helpdesk, un rastreador de problemas con código abierto Django. Es necesario disponer de datos pivotan así por la cartografía y los propósitos de informes
Considere estos modelos:
CHOICE_LIST = (
('open', 'Open'),
('closed', 'Closed'),
)
class Queue(models.model):
name = models.CharField(max_length=40)
class Issue(models.Model):
subject = models.CharField(max_length=40)
queue = models.ForeignKey(Queue)
status = models.CharField(max_length=10, choices=CHOICE_LIST)
Y este conjunto de datos:
colas de espera:
ID | Name
---+------------------------------
1 | Product Information Requests
2 | Service Requests
Problemas:
ID | Queue | Status
---+-------+---------
1 | 1 | open
2 | 1 | open
3 | 1 | closed
4 | 2 | open
5 | 2 | closed
6 | 2 | closed
7 | 2 | closed
Me gustaría ver una anotación/mirada algo agregada como esto:
Queue ID | Name | open | closed
---------+-------------------------------+------+--------
1 | Product Information Requests | 2 | 1
2 | Service Requests | 1 | 3
Ésta es básicamente una tabla de referencias cruzadas o de pivote, en la jerga de Excel. Actualmente estoy creando esta salida usando algunas consultas SQL personalizadas, sin embargo, si puedo pasar al uso del ORM de Django, puedo filtrar los datos de manera más fácil de forma dinámica sin hacer una inserción dudosa de las cláusulas WHERE en mi SQL.
Para "puntos de bonificación": ¿Cómo se haría esto cuando el campo pivote (status
en el ejemplo anterior) era una fecha, y queríamos que las columnas fueran meses/semanas/trimestres/días?
Esta solución se derrumbará si la tabla de Problemas es grande y no puede considerarse general. – JohnnyM
Para cualquiera que lea esto algunos años después: Obtengo el objeto 'collections.defaultdict 'no tiene atributo' count'' con python3 también hay un error tipográfico en' summary.count (q.'closed ') ' –