ORM в Django позволяет нам легко аннотировать (добавлять поля в) наборы запросов на основе связанных данных, однако я не могу найти способ получить несколько аннотаций для различных отфильтрованных подмножеств связанных данных.
Этот вопрос возникает в связи с django-helpdesk , системой отслеживания неисправностей с открытым исходным кодом на базе Django. Мне нужно, чтобы данные были сведены таким образом, чтобы составлять диаграммы и составлять отчеты
. Рассмотрим следующие модели:
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)
И этот набор данных:
Очереди:
ID | Name
---+------------------------------
1 | Product Information Requests
2 | Service Requests
Проблемы:
ID | Queue | Status
---+-------+---------
1 | 1 | open
2 | 1 | open
3 | 1 | closed
4 | 2 | open
5 | 2 | closed
6 | 2 | closed
7 | 2 | closed
Я хотел бы, чтобы аннотация / агрегат выглядел примерно так:
Queue ID | Name | open | closed
---------+-------------------------------+------+--------
1 | Product Information Requests | 2 | 1
2 | Service Requests | 1 | 3
Это в основном кросс-таблица или сводная таблица, выражаясь языком Excel. В настоящее время я создаю этот вывод, используя несколько пользовательских SQL-запросов, однако, если я смогу перейти к использованию Django ORM, я смогу более легко фильтровать данные динамически без изворотливой вставки предложений WHERE в мой SQL.
Для «бонусных баллов»: Как это сделать, если в сводном поле ( status
в приведенном выше примере) была дата, а мы хотели, чтобы столбцы были месяцами / неделями / кварталами / днями?