2012-06-29 95 views
7

我使用了兩個django包 - django-mptt(用於實現Modified Preorder Tree Traversal的實用程序)和django-hvad(模型翻譯)。雙重繼承導致元類衝突

我有一個模型類菜單項,我想它延伸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

爲什麼你需要多重繼承?如果可以的話,通常最好避免它。 – jathanism

+0

因爲MenuItem有翻譯(需要擴展TranslatableModel)並且必須有樹層次結構(需要擴展MPTTModel)。 –

+1

相關:http://stackoverflow.com/a/7314847/194311 – jathanism

回答

5

您可能要做到以下幾點:

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

這應該給你你想要的東西,沒有任何錯誤mesages。

+0

在這種情況下,然後'MenuItem.objects'將是翻譯經理。爲了添加樹管理器,必須手動添加 - 'tobjects = TreeManager()' – miki725

2

對不起,對於遲到的答案,但我認爲它會幫助有同樣問題的人。當你繼承MPTTModel和另一個類,請確保你把MPTTModel第一,像這樣:

class MenuItem(MPTTModel, TranslatableModel): 
+0

這是[文檔推薦的內容](https://django-mptt.github.io/django-mptt/models.html #的建立-A-Django的模型換MPTT) –

1

一般@schacki的答案會工作。然而,django-hvad覆蓋了許多其他的經理/查詢集類,這使得django-mptt/django-polymorphic和朋友不可能同時集成在一起。

看看django-parler,它具有與django-hvad類似的API和管理集成功能,但與其他軟件包也很好。表格佈局是相同的,所以你應該能夠輕鬆地切換軟件包。