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中覆盖模型的元类,或者在模型子类中动态设置字段属性?
你可以使用这样的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).
希望能帮助到你!