双重继承导致元类冲突

时间:2012-06-29 00:05:46

标签: python django database-design

我使用了两个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)

这个问题的解决方案是什么?我希望我可以使用双重继承。

3 个答案:

答案 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和管理集成,但也可以与其他软件包一起使用。表格布局相同,因此您应该可以轻松切换包。