非常に厄介なサイクリングモデルの参照によって引き起こされた元の問題:
# A -> B -> A
class A:
b = models.ForeignKey('B', null=True, blank=True)
class B:
a = models.ForeignKey('A')
ここで、クエリに注釈を付けようとすると、常に a.id の代わりに LEFT OUTER JOIN の GROUP BY a の id (以下の例では T3.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 句で正しいフィールドを指定することですが、その方法がわかりません。出来ますか?問題を解決する他の方法はありますか?ありがとう。