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

我正在使用
MySQL上的Django ORM进行一个非常简单的聚合,它正在生成一个包含数据字段的GROUP BY子句,该字段非常大,并且使查询速度减慢了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是不必要和荒谬的.我可以通过执行值查询来阻止它:

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

但是,我如何得到一个真实的,带注释的文档查询作为结果?

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

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

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

点赞