原来很尴尬的单车模型参考引起的问题:
# A -> B -> A
class A:
b = models.ForeignKey('B', null=True, blank=True)
class B:
a = models.ForeignKey('A')
现在,当我尝试对查询进行注释时,它总是使用 GROUP BY a 的 LEFT OUTER JOIN 的 id(下例中的T3.id)而不是a.id。
例子:
A.objects.select_related('b', 'b__a').annotate(reviews=Count('reviews'))
生成的 SQL:
SELECT
`a`.`id`,
`b`.`id`,
T3.`id`,
FROM
`a`
LEFT OUTER JOIN
`b` ON (`a`.`b_id` = `b`.`id`)
LEFT OUTER JOIN
`a` T3 ON (`b`.`a_id` = T3.`id`)
WHERE
`a`.`id` IN (1, 2, 3, 4, 5)
GROUP BY T3.`id`
ORDER BY NULL;
我知道我可以做接下来的事情:
- 更改模型不做自行车参考(不幸的是现在不能这样做)
- 可以使用 .extra() 代替注释(我会尽量避免)
- 删除 .select_related() 调用(由于性能问题不能这样做)
UPD:使用 GROUP BY T3.id将排除结果,其中 ab == None
对我来说最好的解决方案是在 GROUP BY 子句中指定正确的字段,但我不知道如何。可能吗?有没有其他方法可以解决这个问题?谢谢。