我正在尝试使用Django ORM执行以下查询:
SELECT object_repr, content_type_id, COUNT(object_repr)
FROM django_admin_log GROUP BY object_repr ORDER BY COUNT(object_repr);
我最接近的是:
LogEntry.objects.values('object_repr', 'content_type__id')\
.annotate(num_logs=Count('object_repr'))\
.order_by('num_logs')
不幸的是,这会产生一个返回错误(或至少是意外)结果的SQL语句:
SELECT `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`,
COUNT(`django_admin_log`.`object_repr`) AS `num_logs`
FROM `django_admin_log`
GROUP BY `django_admin_log`.`object_repr`, `django_admin_log`.`content_type_id`
ORDER BY num_logs
values()方法包括“GROUP BY”段中的所有指定列,我不希望在GROUP BY中使用content_type_id
。甚至可以在ORM中执行此操作吗?
编辑:在ORM中无法做到这一点。然而,为了未来人们发现这个问题的兴趣,我写的查询做了我需要的是:
SELECT DISTINCT djl2.id, djl1.object_id, djl1.object_repr,
djl1.content_type_id,
COUNT(djl1.content_type_id) AS num_items
FROM django_admin_log AS djl1
INNER JOIN django_admin_log AS djl2
ON djl1.id=djl2.id
GROUP BY djl1.object_repr, djl1.content_type_id
ORDER BY num_items
基本上是一种自我内心的联系。祝你好运,希望这会有所帮助。
答案 0 :(得分:3)
我实际上是在最近几天经历了这个问题并发布了一个问题,但在我看来,它的措辞并不像你的那么好。
无论如何,我发现虽然Sqlite和MySql在你运行查询时不会出错,你选择了group by子句中找不到的列,但这些结果可能有些不确定,因为sql的标准显然是不允许这样。我知道MSSQL会在你尝试这个时返回一个错误,我不确定其他版本的sql。
基于此,我得出结论,django不允许通过ORM生成类似的查询,因为它在技术上无效,即使它可能在某种程度上对某些SQL有效。
以下是我的问题的链接供参考:Can I control the GROUP BY in django 1.3's orm?