在Django 1.5中缺少元类

Cer*_*rin 1 python django django-models

你如何在Django 1.5中覆盖模型的元类?我在一些继承自抽象模型的模型上覆盖了元类,因此我可以设置适当的选择.例如

class BaseModel(models.Model):

    field_with_choices = models.CharField(max_length=100)

    class Meta:
        abstract = True

class MyModelMetaClass(BaseModel.__metaclass__):
    def __new__(cls, *args, **kwargs):
        new_class = super(MyModelMetaClass, cls).__new__(cls, *args, **kwargs)
        field = new_class._meta.get_field('field_with_choices')
        choices = field._choices = []
        choices.extend(get_choices())
        return new_class

class MyModel(BaseModel):

    __metaclass__ = MyModelMetaClass
Run Code Online (Sandbox Code Playgroud)

但是,当我升级到Django 1.5时,我现在得到错误:

AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Run Code Online (Sandbox Code Playgroud)

如何在1.5中覆盖模型的元类,或者在模型子类中动态设置字段属性?

Pau*_* Bu 5

你可以使用这样的built-in功能type:

class MyModelMetaClass(type(BaseModel)):
    def __new__(cls, *args, **kwargs):
        new_class = super(MyModelMetaClass, cls).__new__(cls, *args, **kwargs)
        field = new_class._meta.get_field('field_with_choices')
        choices = field._choices = []
        choices.extend(get_choices())
        return new_class
Run Code Online (Sandbox Code Playgroud)

虽然我看到,type(ModelBase) is type所以你基本上都能继承type或可能从Model.__metaclass__后者又ModelBase因此ModelBase是Model元类建筑的顶部(前type当然是:d).

希望能帮助到你!