2012-06-29 26 views
7

Tôi sử dụng hai gói django - django-mptt (tiện ích để thực hiện Sửa đổi trước khi bắt đầu Tree Traversal) và django-hvad (dịch mô hình).Thừa kế đôi gây ra xung đột metaclass

Tôi có một lớp mô hình MenuItem và tôi muốn nó kéo dài TranslatableModel và MPTTModel, như thế này:

class MenuItem(TranslatableModel, MPTTModel): 

nhưng nó gây ra xung đột 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) 

giải pháp này là gì vấn đề? Tôi hy vọng rằng tôi có thể sử dụng thừa kế đôi.

+0

Tại sao bạn cần đa thừa kế? Nó thường là tốt nhất để tránh nó khi bạn có thể. – jathanism

+0

Vì MenuItem có bản dịch (cần mở rộng TranslatableModel) và phải có hệ thống phân cấp cây (cần mở rộng MPTTModel). –

+1

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

Trả lời

5

Bạn có thể muốn làm như sau:

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

Điều này sẽ cho bạn biết chính xác những gì bạn muốn, mà không cần bất kỳ mesages lỗi.

+0

Trong trường hợp này thì 'MenuItem.objects' sẽ là người quản lý dịch thuật. Để thêm trình quản lý cây, nó phải được thêm thủ công - 'tobjects = TreeManager()' – miki725

2

Xin lỗi vì câu trả lời muộn, nhưng tôi nghĩ nó sẽ giúp ích cho những người có cùng vấn đề. Khi bạn phân lớp MPTTModel và lớp khác, chắc chắn rằng bạn đặt MPTTModel đầu tiên, như thế này:

class MenuItem(MPTTModel, TranslatableModel): 
+0

Đây là [những gì các tài liệu đề xuất] (https://django-mptt.github.io/django-mptt/models.html # thiết lập-up-a-django-model-cho-mptt) –

1

Nói chung câu trả lời của @schacki sẽ làm việc. Tuy nhiên, django-hvad ghi đè nhiều lớp quản lý/queryset khác dưới mui xe, mà làm cho tích hợp với django-mptt/django-đa hình và bạn bè không thể vào lúc này.

Hãy xem django-parler, có tính năng tương tự như API và tích hợp quản trị như django-hvad, nhưng cũng chơi tốt với các gói khác. Bố cục bảng giống hệt nhau, vì vậy bạn có thể dễ dàng chuyển đổi các gói.

Các vấn đề liên quan