【发布时间】:2018-11-16 15:55:32
【问题描述】:
我的模型结构如下:
class A(models.Model):
prop_a = models.CharField(max_length=255)
class B(A):
prop_b = models.CharField(max_length=255)
class C(A):
prop_c = models.CharField(max_length=255)
class D(models.Model):
fk = models.ForeignKey('A')
所以本质上,我有一个模型 (D),它有一个“抽象”模型 (A) 的外键,它是 B 和 C 的子类。
现在,当我运行D.objects.all().select_related() 时,只查询A 的属性。我认为这是因为在查询时,Django 不知道 fk 是哪个子类的实例(在我当前的结构中也不知道)。
有什么方法可以在不改变模型结构的情况下查询子类的属性?
我还尝试了 prefetch_related 并尝试使用来自 django-model-utils 的 InheritanceManager,但均无济于事。
编辑:澄清一下,我正在寻找一种方法来遍历D 的对象,访问fk 的具体值(B 或C 对象) 而只访问数据库一次。
运行 D.objects.all().select_related() 会产生查询
'SELECT "mapping_d"."id", "mapping_d"."fk_id", "mapping_a"."id", "mapping_a"."prop_a" FROM "mapping_d" INNER JOIN "mapping_a" ON ("mapping_d"."fk_id" = "mapping_a"."id")'
假设其中一个是D 类型的对象d,其属性fk 的类型为C。
现在,当我访问值 d.fk.c 时,Django 运行一个额外的查询来获取 C 的属性:
'SELECT "mapping_a"."id", "mapping_a"."prop_a", "mapping_c"."a_ptr_id", "mapping_c"."prop_c" FROM "mapping_c" INNER JOIN "mapping_a" ON ("mapping_c"."a_ptr_id" = "mapping_a"."id") WHERE "mapping_c"."a_ptr_id" = 3'
我想避免每个 D 对象的额外查询。以建议的方式使用 InheritanceManager 似乎没有这样做。
【问题讨论】:
标签: python django inheritance