我的项目中有一个抽象模型,我想用它来默认在具体的子类上定义一个字段,但也允许将该字段重新定义为动态默认值以外的其他字段。所有这一切现在都有效:
class classproperty(object):
"""
Decorator for making class properties
"""
def __init__(self, fget):
self.fget = fget
def __get__(self, owner_self, owner_cls):
return self.fget(owner_cls)
class BaseModel(models.Model):
class Meta(object):
abstract = True
@classproperty
def _special_attribute_field(self):
return getattr(self, '_bm_special_attribute_field', 'default')
@property
def bm_special_attribute(self):
return getattr(self, self._special_attribute_field)
...然后有一堆方法使用后两个函数来确定要访问的字段。
问题是,现在,继承自BaseModel
的类必须明确定义default
字段,即使它们不使用_bm_special_attribute_field
来指定默认值以外的其他字段。我想做的是以编程方式在具体的子模型上定义default
,只有当这些模型不使用_bm_special_attribute_field
将其更改为其他东西时,在这种情况下,他们应该带上自己的领域。有没有办法做到这一点,也许是使用元类?关键是它不得不破坏Django机器。