У меня есть следующая структура модели:
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 и пытался использовать InheritanceManager из django-model-utils , оба безрезультатно.
Редактировать: Чтобы уточнить,Я ищу способ перебирать объекты 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 предложенным способом, похоже, не позволяет этого.