python - Django 1.9 中的 query.group by

标签 python django

我正在将代码从 Django 1.6 移至 1.9。 在 1.6 中我有这段代码

模型.py

class MyReport(models.Model):
    group_id    =   models.PositiveIntegerField(blank=False, null=False)

View .py

query = MyReport.objects.filter(owner=request.user).query
query.group_by = ['group_id']
entries = QuerySet(query=query, model=MyReport)

查询将为每个“group_id”返回一个对象;由于我的使用方式,任何具有 group_id 的表行都可以作为代表。

在 1.9 中,此代码已损坏。上面第二行之后的查询是:

SELECT "reports_myreport"."group_id", ... etc FROM "reports_myreport" WHERE "reports_myreport"."owner_id" = 1 GROUP BY "reports_myreport"."group_id", "reports_report"."otherfield", ...

基本上,它列出了 group by 子句中的所有表字段,使查询返回整个表。

尽管在调试器中我看到了

query.group_by = ['group_by'] 

它看起来不像 query.group_by 是 1.9 中的方法,1.7-1.9 的变更日志也没有表明有什么变化。

有没有更好的方法 - 不依赖于内部 Django 的东西 - 我可以用于我的查询?

有什么方法可以修复我当前的查询吗?

最佳答案

您可以使用 order_by()要获得排序的结果,在同一个查询中,您可以按第二个条件排序。

如果您想要获取组,则需要遍历集合以检索这些值。

如果您消费了查询返回的所有结果,您可以考虑:

a) itertools.groupby它创建了一个内存中的组,但你不应该将它用于大型数据集。

b) 另一种选择是使用 Manager.raw()但您需要在 Django 中编写 SQL,如下所示:

for report in MyReport.objects.raw('SELECT * FROM reporting_report GROUP by group_id'):
     print(report)

这适用于大型数据集,但您可能会失去与某些数据库引擎的兼容性。

奖励:我建议您在重写之前了解旧代码的确切作用。

关于python - Django 1.9 中的 query.group by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558120/

相关文章:

ios - 使用 Django 通过 Apns(iOS 推送通知)发送其他数据

python - 将事务数据格式的 pandas 数据框转换为列表 - Python

python - Python 最好的浏览器自动化工具是什么?

python - 如何创建不同点大小的图形?

python - 如何保护 Django 中的对象不被删除?

关系 "name"的 Django 列 "django_content_type"不存在

python - 不同目录下的不同导入结果

python - 比较 python 中的字符串,例如 sql "like"(带有 "%"和 "_")

sql - 多种实体类型的最佳数据库设计

python django 异常处理