【发布时间】:2015-09-12 02:21:17
【问题描述】:
原来很别扭的单车模型参考引起的问题:
# 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 将排除结果,其中 a.b == None
对我来说最好的解决方案是在 GROUP BY 子句中指定正确的字段,但我不知道如何。可能吗?有没有其他方法可以解决这个问题?谢谢。
【问题讨论】:
-
不是
T3==a,来自a as T3吗?不知道你想在这里实现什么.. -
使用 GROUP BY T3.id 排除了 a.b == None 的结果,同时它不是预期的。
-
至于我试图实现的目标 - 模型可以通过 B 拥有父对象。我知道这不是最好的方法,但它是一种模型进化。
标签: sql django django-models django-orm django-aggregation