Django聚合会产生过多的GROUP BY子句

时间:2011-11-01 22:00:51

标签: mysql sql django aggregation

我正在使用MySQL上的Django ORM进行一个非常简单的聚合,它正在生成一个GROUP BY子句,其中包含data字段,该字段非常大,并且正在减慢查询速度超过100倍。

以下是该模型的简化版本:

class Document(models.Model):
    data = models.TextField()

class Attachment(models.Model):
    document = models.ForeignKey(Document)

我正在运行的查询:

Document.objects.annotate(num_attachments=Count('attachment'))

SQL输出:

SELECT
  `document_document`.`id`,
  `document_document`.`data`,
  COUNT(`document_attachment`.`id`) AS `num_attachments`
FROM `document_document`
  LEFT OUTER JOIN `document_attachment`
    ON (`document_document`.`id` = `document_attachment`.`document_id`) 
GROUP BY
  `document_document`.`id`,
  `document_document`.`id`,
  `document_document`.`data`
ORDER BY NULL

对数据字段执行GROUP BY是不必要和荒谬的。我可以通过执行values查询来停止此操作:

Document.objects.values('pk').annotate(num_attachments=Count('attachment'))

但是,如何才能获得真实的,带注释的Document查询?

1 个答案:

答案 0 :(得分:2)

Django核心提交者Karen Tracy已经确认这实际上是Django中的一个错误:

http://groups.google.com/group/django-users/browse_thread/thread/22d4d46c8646b2c4#

https://code.djangoproject.com/ticket/17144