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 упорядочивает загрузку моделей, но мне не удалось ничего найти. Либо это так, либо процесс не работает каким-то неизвестным образом.