我试图使用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方法包含"GROUP BY“段中的所有指定列,我不希望content_type_id在我的组BY中。在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基本上是自我内在的连接。祝你好运,希望这能帮上忙。
发布于 2011-07-27 18:31:44
实际上,我在过去几天里刚刚经历过这个问题,并发布了一个问题,但在我看来,它的措辞不如你的好。
无论如何,我发现,虽然Sqlite和MySql在运行查询时不会出现错误,但在group子句中选择未找到的列时,这些结果可能有些可疑,因为sql的标准显然是不允许这样做。我知道MSSQL在尝试时会返回一个错误,我不确定其他类型的sql。
基于此,我得出这样的结论: django不允许通过ORM生成这样的查询,因为它在技术上是无效的,即使它在某种程度上可以在某些类型的SQL上工作。
以下是我的问题的链接,以供参考:Can I control the GROUP BY in django 1.3's orm?
https://stackoverflow.com/questions/6849179
复制相似问题