将abc子类化的django模型会产生元类冲突

时间:2012-01-04 07:52:59

标签: python django conflict metaclass 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

但是我收到以下错误。

  

元类冲突:派生类的元类必须是a   (非严格的)所有基础的元类的子类

我认为这里的问题是(正如这里所描述的http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/),两个基类有两个不同的元类,因此python无法决定使用哪个元类用于子对象。

为了解决这个问题,我删除了多个继承并使用以下注册方法来注册子类

abc.register(Child)

但我不喜欢这种方法,因为它看起来像是猴子修补。

有没有其他方法可以解决这个问题?

我尝试将Model元类明确地分配给Child,但它不起作用。 我不是在寻找通过编写代码来解决它的方法。我认为这必须通过改变我的类结构来解决。

1 个答案:

答案 0 :(得分:2)

除了创建一个继承自ABCMetaModelBase的新元类,或使ABCMeta继承自ModelBase之外你可以做多少。

但是,可能有不同的注册模式? 也许像contrib.admin.autodiscover或类装饰器?或者.py文件底部的循环,在相应的类上调用register(例如,for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var))?

修改:D'哦。我假设ABCMeta是一个例子,而不是ABCMeta。这就是我在太少睡眠时浏览StackOverflow所得到的。