Skip to main content
 首页 » 编程设计

python之Django 1.9 中的 query.group by

2025年05月04日30artech

我正在将代码从 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) 

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

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