7

我使用了两个 django 包 - django-mptt(用于实现修改的预序树遍历的实用程序)和 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)

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

4

3 回答 3

5

您可能想要执行以下操作:

class CombinedMeta(TranslatableModel.__metaclass__, MPTTModel.__metaclass__):
    pass
class MenuItem(TranslatableModel, MPTTModel):
    __metaclass__=CombinedMeta

这应该给你你想要的,没有任何错误消息。

于 2012-08-13T19:43:05.283 回答
2

很抱歉回答迟了,但我认为它会对有同样问题的人有所帮助。当您子类MPTTModel和另一个类时,请确保将MPTTModel其放在第一位,如下所示:

class MenuItem(MPTTModel, TranslatableModel):
于 2012-12-18T08:20:14.630 回答
1

通常@shacki 的答案会起作用。但是,django-hvad 在后台覆盖了许多其他管理器/查询集类,这使得目前无法与 django-mptt/django-polymorphic 和朋友集成。

看看django-parler,它具有与 django-hvad 类似的 API 和管理集成,但也可以与其他包配合使用。表格布局相同,因此您应该能够轻松切换包。

于 2013-09-11T08:06:25.170 回答