2011-11-01 141 views
4

我正在使用MySQL上的Django ORM進行非常簡單的聚合,並且它正在生成GROUP BY子句,其中包含data字段,該字段非常大,並且正在通過over 100倍。Django聚合做了過多的GROUP BY子句

這裏是模型的簡化版本:與

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

的SQL輸出:

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

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

而且我運行查詢

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')) 

但後來我怎麼得到一個真正的,註釋的文檔作爲查詢的結果?

+0

也就是說奇怪,我試圖與外鍵的類似例子,它不會工作。我只能讓它與ManyToMany關係一起工作。我知道這是模型的簡化版本,您是否可能有不同的ManyToManyField指向文檔的某處?還是有一個文檔自我領域,一個文檔引用另一個文檔? – Furbeenator

+0

我設置了相同的模型並嘗試過,只添加了一個'name = models.CharField(max_length = 24)'並且有類似的東西,只有它有三個字段的GROUP BY,TWICE!絕對看起來像一個錯誤。我正在使用1.3.1版,結果相同。 – Furbeenator

+0

@Furbeenator我找不到任何與Django bug跟蹤器相關的東西。順便說一句,我在1.3.0上。 –

回答