2012-06-29 13 views
7

मैं दो django संकुल का उपयोग करता हूं - django-mptt (संशोधित प्रीऑर्डर ट्री ट्रैवर्सल को कार्यान्वित करने के लिए उपयोगिताओं) और django-hvad (मॉडल अनुवाद)।डबल विरासत मेटाक्लास संघर्ष का कारण बनता है

मैं MenuItem एक मॉडल वर्ग है और मैं चाहता हूँ यह TranslatableModel और MPTTModel, इस तरह फैली करने के लिए:

class MenuItem(TranslatableModel, MPTTModel): 

लेकिन यह metaclass संघर्ष का कारण बनता है:

(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

क्योंकि मेनूइटम में अनुवाद हैं (अनुवाद करने योग्य मॉडल को विस्तारित करने की आवश्यकता है) और पेड़ पदानुक्रम होना चाहिए (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 # स्थापन एक Django मॉडल के लिए mptt) –

1

आम तौर पर @schacki का जवाब काम करेगा। हालांकि, django-hvad हुड के नीचे कई अन्य प्रबंधक/क्वेरीसेट कक्षाओं को ओवरराइड करता है, जो इस समय django-mptt/django-polymorphic और दोस्तों को असंभव बनाता है।

django-parler पर एक नज़र डालें, जिसमें एक समान एपीआई और व्यवस्थापक एकीकरण django-hvad के रूप में है, लेकिन अन्य पैकेजों के साथ भी अच्छा खेलता है। तालिका लेआउट समान है, इसलिए आप आसानी से संकुल को स्विच करने में सक्षम होना चाहिए।