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