我有一个django抽象类:
class AbstractModel(models.Model):
date_added = models.DateField(auto_now_add=True)
class Meta:
abstract = True
我希望我的具体类(Django Models(将这个抽象类子类化,但我也希望确保我的所有具体类始终使用abc
实现非常特定的方法。
我试过这样做:
class AbstractBaseClass(AbstractModel, metaclass=abc.ABCMeta):
@abstractmethod
def important_method(self):
pass
class MyDjangoModel(AbstractBaseClass):
...
我试过了:
class AbstractBaseClass(ABC):
@abstractmethod
def important_method(self):
pass
class MyDjangoModel(AbstractModel, AbstractBaseClass):
两者都不起作用。他们都说:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
有没有办法做到这一点,或者这是不可能的?
您非常接近正确的解决方案,请参阅示例:
import abc
from django.db import models
class AbstractModelMeta(abc.ABCMeta, type(models.Model)):
"""AbstractModelMeta used as a metaclass"""
class AbstractBaseClass(models.Model, metaclass=AbstractModelMeta):
date_added = models.DateField(auto_now_add=True)
class Meta:
abstract = True
@abc.abstractmethod
def important_method(self):
pass
class MyDjangoModel(AbstractBaseClass):
first_name = models.CharField(max_length=10)
如果抽象方法没有按预期实现,您将得到一个错误:
>>> from main.models import MyDjangoModel
>>> m = MyDjangoModel()
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: Can't instantiate abstract class MyDjangoModel with abstract methods important_method