Die ORM in Django können wir leicht annotieren (Felder hinzufügen) Querysets basierend auf verwandten Daten, hwoever ich kann nicht finden, eine Möglichkeit, mehrere Annotationen für verschiedene gefilterte Teilmengen von verwandten Daten zu erhalten.
Diese Frage wird gestellt in Bezug auf django-helpdesk ein Open-Source Django-basierter Trouble-Ticket-Tracker. Ich brauche Daten, die für Diagramm- und Berichtszwecke wie folgt gedreht werden
Betrachten Sie diese Modelle:
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)
Und dieser Datensatz:
Warteschlangen:
ID | Name
---+------------------------------
1 | Product Information Requests
2 | Service Requests
Probleme:
ID | Queue | Status
---+-------+---------
1 | 1 | open
2 | 1 | open
3 | 1 | closed
4 | 2 | open
5 | 2 | closed
6 | 2 | closed
7 | 2 | closed
Ich würde mir wünschen, dass eine Anmerkung/ein Aggregat etwa so aussieht:
Queue ID | Name | open | closed
---------+-------------------------------+------+--------
1 | Product Information Requests | 2 | 1
2 | Service Requests | 1 | 3
Dies ist im Grunde eine Kreuztabelle oder Pivot-Tabelle, in Excel parlance. Ich baue derzeit diese Ausgabe mit einigen benutzerdefinierten SQL-Abfragen, aber wenn ich auf die Verwendung der Django ORM bewegen kann ich leichter filtern die Daten dynamisch, ohne fragwürdige Einfügung von WHERE-Klauseln in meinem SQL zu tun.
Für "Bonuspunkte": Wie würde man dies tun, wenn das Pivot-Feld ( status
im obigen Beispiel) war ein Datum, und wir wollten, dass die Spalten Monate / Wochen / Quartale / Tage sind?