Многотабличное наследование в Django + оптимизация запросов с помощью django-model-utils
У меня есть некоторые проблемы с оптимизацией ManyToManyField
в дочерней модели с конкретным наследованием.
Предположим, что у меня есть модели:
class CoreModel(models.Model):
parent = ForeignKey(Parent)
class Parent(models.Model):
pass
@cached_property
def child(self):
return Parent.objects.get_subclass(pk=self.pk)
class ChildA(Parent):
many = ManyToManyField(SomeModel)
class ChildB(Parent):
many = ManyToManyField(SomeModel)
В шаблоне я делаю вызов:
{% for m in parent.child.many.all %}
{{ m.title }}
{% endfor %}
И это выполняет дополнительный запрос для каждого экземпляра. На мой взгляд, я пытался оптимизировать таким образом :
core_instance = CoreModel.objects.prefetch_related(
Prefetch(
"parent",
queryset=Parent.objects.select_subclasses()\
.prefetch_related("many")
)
Однако я получаю ошибку:
ValueError: Cannot query ChildAObject(some_pk). Must be "ChildB" instance.
Как я понимаю, select_subclasses()
«преобразует» родительский класс в дочерний. Оба дочерних класса имеют одинаковые поля, но все равно получаю ошибку.
Что я упускаю?