Агрегация Django делает чрезмерные предложения GROUP BY - PullRequest
4 голосов
/ 02 ноября 2011

Я выполняю очень простое агрегирование с использованием ORM Django на MySQL, и оно создает предложение 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 Ответ

2 голосов
/ 02 ноября 2011

Karen Tracy, основной комментатор Django, подтвердил, что это действительно ошибка в Django:

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

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

...