Многотабличное наследование в 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() «преобразует» родительский класс в дочерний. Оба дочерних класса имеют одинаковые поля, но все равно получаю ошибку. Что я упускаю?

Вернуться на верх