MPTT Multiple Inheritance Fails после обновления с Django3.0 до Django3.1

До сих пор мне не везло в попытках решить эту проблему. Но чтобы исправить некоторые уязвимые пакеты, я обновляю приложение Django с 2.8 -> 3.2. Переход с 2.8 -> 3.0 работал без проблем, но когда я перехожу на 3.1, я начинаю терпеть неудачу на шаге collectstatic из-за бесполезного django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. Вот определение затронутого класса

class OrganizationHierarchyNode(
        MPTTModel,
        WithAPI,
        ModelWithSoftDelete,
        metaclass=classmaker()):
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
    parent = TreeForeignKey(
        'self',
        null=True,
        blank=True,
        related_name='children',
        db_index=True, on_delete=models.CASCADE)
    hierarchy_level_map = models.ForeignKey(
        'HierarchyLevelMap', null=True, blank=True, on_delete=models.SET_NULL)
    root = None
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='created_by',
                                   on_delete=models.CASCADE)
    modified_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='modified_by',
                                    on_delete=models.CASCADE)

    hierarchy_scope = models.CharField(max_length=200, null=True, editable=False, blank=True)

Я использую django-mptt v0.16.0 и python v3.9.

В логах видно, что он терпит неудачу, когда вызывает функцию classmaker()

def classmaker(left_metas=(), right_metas=()):
    def make_class(name, bases, adict):
        print(f"ttyxl Name: {name}")
        print(f"ttyxl Bases: {bases}")
        print(f"ttyxl Adict: {adict}")
        metaclass = get_noconflict_metaclass(bases, left_metas, right_metas)
        print(f"ttyxl Metaclass: {metaclass(name, bases, adict)}")
        return metaclass(name, bases, adict)

    return make_class

Он выведет один раз для базового класса

ttyxl Name: OrganizationHierarchyNode
ttyxl Bases: (<class 'mptt.models.MPTTModel'>, <class 'mgmt.api.models.with_api.WithAPI'>, <class 'mgmt.models.base.ModelWithSoftDelete'>)

Затем сразу после этого выводится

ttyxl Name: _MPTTModelBaseWithAPIMeta
ttyxl Bases: (<class 'mptt.models.MPTTModelBase'>, <class 'entity_mgmt.api.models.with_api_meta.WithAPIMeta'>)
ttyxl Adict: {}
ttyxl Metaclass: <class 'mgmt.nonconflict._MPTTModelBaseWithAPIMeta'>

До того, как произойдет крах с вышеуказанной ошибкой.

Мне кажется, что, скорее всего, произошло какое-то изменение в том, как Django упорядочивает загрузку моделей, но мне не удалось ничего найти. Либо это так, либо процесс не работает каким-то неизвестным образом.

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