python - 在 Django ORM 中旋转数据和复杂注释

标签 python sql django django-orm

Django 中的 ORM 让我们可以轻松地根据相关数据注释(添加字段)查询集,但是我找不到为相关数据的不同过滤子集获取多个注释的方法。

这是关于 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,我可以更轻松地动态过滤数据,而无需在我的 SQL 中不小心插入 WHERE 子句。

对于“奖励积分”:如果数据透视字段(上例中的 status)是一个日期,我们希望这些列是月/周/季度/天,那么如何做到这一点?

最佳答案

你有 Python,使用它。

from collections import defaultdict
summary = defaultdict( int )
for issue in Issues.objects.all():
    summary[issue.queue, issue.status] += 1

现在您的 summary 对象有队列,状态为二元组键。您可以使用各种模板技术直接显示它。

或者,如果更简单的话,您可以将其重新组合成类似表格的结构。

table = []
queues = list( q for q,_ in summary.keys() )
for q in sorted( queues ):
    table.append( q.id, q.name, summary.count(q,'open'), summary.count(q.'closed') )

您有很多很多 Python 技术来制作数据透视表。

如果您进行衡量,您可能会发现像这样的主要使用 Python 的解决方案实际上比纯 SQL 解决方案更快。为什么?映射比需要将排序作为 GROUP-BY 的一部分的 SQL 算法更快。

关于python - 在 Django ORM 中旋转数据和复杂注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5958415/

相关文章:

python - Pandas 绘制一个重复的数据框

python - 什么是 python Web 框架

java - 如何使用ORDER BY按多个排序条件排序

django - postgres 不启动。 (涉及到 Django 和 Docker)

Python 导入突然失败

Python – 如何模拟单个函数

mysql - SQL 服务器 : How to override Error 0xc02020a1: Data Flow Task 1: Data conversion failed

mysql - 使用 Group By 和 Count 优化查询

python - 如何遍历 ReportLab 的 rml 文件中的列表

Django 和 Google App Engine Helper 找不到 ipaddr 模块