Модель Django, которая подклассов abc, дает конфликт метакласса

У меня есть следующая модель и абстрактный базовый класс

import abc
from django.db import models


class AbstractBase():
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def my_method(self):
        return


class MyModel(models.Model, AbstractBase):
    @abc.abstractmethod
    def my_method(self):
        return 1

Но я получаю следующую ошибку.

конфликт метаклассов: метакласс производного класса должен быть (нестрогим) подклассом метаклассов всех его баз

Я думаю, что проблема здесь (как описано здесь http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/) в том, что два базовых класса имеют два разных метакласса, поэтому python не может решить, какой метакласс использовать для дочернего объекта.

Чтобы решить эту проблему, я удалил множественное наследование и использовал следующий метод register для регистрации дочернего класса

abc.register(Child)

Но мне не очень понравился этот подход, так как он выглядит как исправление обезьян.

Есть ли другой способ решить эту проблему?

Я пытаюсь явно назначить метакласс Model для Child, но это не сработало. Я не ищу способ решить это путем написания кода. Я думаю, что это должно быть решено путем изменения структуры моего класса.

1 ответ

Помимо создания нового метакласса, который наследует от обоих ABCMeta а также ModelBase, или делая ABCMeta наследовать от ModelBase, там не так много, вы можете сделать

Тем не менее, может быть уместен другой шаблон регистрации? Может быть что-то вроде contrib.admin.autodiscover? Или декоратор класса? Или петля в нижней части .py файл, который вызывает register на соответствующих классах (например, for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var))?

Редактировать: D'Oh. Я предположил, что ABCMeta был примером, а не ABCMeta, Это то, что я получаю за просмотр Stackru на слишком мало сна.

Другие вопросы по тегам