如何为查找添加列,但是将其从GROUP BY中排除?

时间:2011-07-27 18:14:51

标签: python django orm

我正在尝试使用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

基本上是一种自我内心的联系。祝你好运,希望这会有所帮助。

1 个答案:

答案 0 :(得分:3)

我实际上是在最近几天经历了这个问题并发布了一个问题,但在我看来,它的措辞并不像你的那么好。

无论如何,我发现虽然Sqlite和MySql在你运行查询时不会出错,你选择了group by子句中找不到的列,但这些结果可能有些不确定,因为sql的标准显然是不允许这样。我知道MSSQL会在你尝试这个时返回一个错误,我不确定其他版本的sql。

基于此,我得出结论,django不允许通过ORM生成类似的查询,因为它在技术上无效,即使它可能在某种程度上对某些SQL有效。

以下是我的问题的链接供参考:Can I control the GROUP BY in django 1.3's orm?