7

私は 2 つの 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)

この問題の解決策は何ですか? 二重継承が使えるようになることを願っています。

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

一般的に@schackiの答えはうまくいくでしょう。ただし、django-hvad は内部で他の多くのマネージャー/クエリセット クラスをオーバーライドするため、現在のところ、django-mptt/django-polymorphic およびその仲間との統合は不可能です。

django-hvadと同様の API と管理機能の統合を特徴とするdjango-parlerを見てください。テーブル レイアウトは同じなので、パッケージを簡単に切り替えることができるはずです。

于 2013-09-11T08:06:25.170 に答える