2012-06-29 14 views
7

Uso dos paquetes django: django-mptt (utilidades para implementar Modified Preorder Tree Traversal) y django-hvad (traducción de modelos).La herencia doble causa un conflicto de metaclases

que tienen una clase del modelo Menultem y quiero que se extiende TranslatableModel y MPTTModel, así:

class MenuItem(TranslatableModel, MPTTModel): 

pero provoca conflictos metaclase:

(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) 

¿Cuál es la solución de este ¿problema? Espero poder usar doble herencia.

+0

¿Por qué necesita herencia múltiple? Por lo general, es mejor evitarlo cuando puedas. – jathanism

+0

Porque MenuItem tiene traducciones (necesita extender TranslatableModel) y debe tener una jerarquía de árbol (la necesidad se extiende MPTTModel). –

+1

Relacionados: http://stackoverflow.com/a/7314847/194311 – jathanism

Respuesta

5

Es posible que desee hacer lo siguiente:

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

Esto debe darle exactamente lo que quiere, sin ningún tipo de error mesages.

+0

En este caso, entonces 'MenuItem.objects' será el gerente de traducción. Para agregar Tree Manager, tiene que agregarse manualmente - 'tobjects = TreeManager()' – miki725

2

Perdón por la respuesta tardía, pero creo que ayudará a las personas que tengan el mismo problema. Cuando subclase MPTTModel y otra clase, asegúrese de poner MPTTModel primero, así:

class MenuItem(MPTTModel, TranslatableModel): 
+0

Esto es [lo que los documentos recomiendan] (https://django-mptt.github.io/django-mptt/models.html # setting-up-a-django-model-for-mptt) –

1

En general la respuesta de @schacki funcionaría. Sin embargo, django-hvad anula muchas otras clases manager/queryset bajo el capó, lo que hace que la integración con django-mptt/django-polymorphic y sus amigos sea imposible en este momento.

Eche un vistazo a django-parler, que presenta una API similar y una integración de administrador como django-hvad, pero también funciona bien con otros paquetes. El diseño de la mesa es idéntico, por lo que debería poder cambiar los paquetes fácilmente.

Cuestiones relacionadas