17 Stimmen

Pivotierung von Daten und komplexen Anmerkungen in Django ORM

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X