Django1.5中缺少元类

2024-04-26 22:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在django1.5中如何重写模型的元类?我在一些继承自抽象模型的模型上重写元类,以便设置适当的选择。e、 g

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

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

^{pr2}$

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


Tags: 模型fieldnewgetmodelmodelswithargs
2条回答

如果我理解正确的话,django1.5使用six进行兼容性管理。根据docs,正确的方法如下:

from six import with_metaclass

class Meta(type):
    pass

class Base(object):
    pass

class MyClass(with_metaclass(Meta, Base)):
    pass

您可以使用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

虽然我看到type(ModelBase) is type所以你基本上可以从type或者可能从Model.__metaclass__继承,这反过来又是{}所以ModelBase是模型元类架构的顶部(当然在type之前:D)。在

希望有帮助!在

相关问题 更多 >