我使用了两个django包 - django-mptt(用于实现Modified Preorder Tree Traversal的实用程序)和django-hvad(模型转换)。
我有一个模型类 MenuItem ,我希望它扩展TranslatableModel和MPTTModel,如下所示:
class MenuItem(TranslatableModel, MPTTModel):
但它会导致元类冲突:
(TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class
must be a (non-strict) subclass of the metaclasses of all its bases)
这个问题的解决方案是什么?我希望我可以使用双重继承。
答案 0 :(得分:5)
您可能需要执行以下操作:
class CombinedMeta(TranslatableModel.__metaclass__, MPTTModel.__metaclass__):
pass
class MenuItem(TranslatableModel, MPTTModel):
__metaclass__=CombinedMeta
这应该可以准确地提供您想要的内容,而不会出现任何错误消息。
答案 1 :(得分:2)
对于迟到的回答感到抱歉,但我认为这对有相同问题的人有帮助。当您继承MPTTModel
和另一个类时,请确保先放置MPTTModel
,如下所示:
class MenuItem(MPTTModel, TranslatableModel):
答案 2 :(得分:1)
一般来说@schacki的答案都有效。但是,django-hvad会覆盖引擎盖下的许多其他管理器/查询集类,这使得与django-mptt / django-polymorphic和朋友的集成暂时无法实现。
看一下django-parler,它具有与django-hvad类似的API和管理集成,但也可以与其他软件包一起使用。表格布局相同,因此您应该可以轻松切换包。