Django が過剰なクエリを実行しないようにプリフェッチ関連を使用しようとしていますが、継承のあるモデルでは機能しません。
問題は、継承を使用してモデルをトラバースすると、モデル インスタンスがキャッシュされず、SQL クエリが発行されることです。
これが Django のバグなのか、それとも間違った使い方をしているのかはわかりません。
これが私のコードです:
models.py:
class ParentBase(models.Model): pass
class Parent(models.Model): pass
class ParentWithBase(ParentBase): pass
class Child(models.Model):
parent = models.ForeignKey('Parent')
parent_with_base = models.ForeignKey('ParentWithBase')
テストケース:
def test_prefetch_error(self):
Child.objects.create(parent = Parent.objects.create(), parent_with_base = ParentWithBase.objects.create())
child = Child.objects.prefetch_related('parent','parent_with_base').all()[0]
with self.assertNumQueries(0):
child.parent # This works just fine - no queries are emitted
with self.assertNumQueries(0):
child.parent_with_base # TEST FAILS HERE - since one query is emitted