Django在抽象模型中有条件地定义了模型字段

时间:2013-03-06 14:00:43

标签: django django-models django-orm

我的项目中有一个抽象模型,我想用它来默认在具体的子类上定义一个字段,但也允许将该字段重新定义为动态默认值以外的其他字段。所有这一切现在都有效:

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机器。

0 个答案:

没有答案