访问django模型的init方法中的父字段

时间:2013-02-16 10:12:50

标签: python django inheritance django-models

我想从模型init函数中访问模型的继承字段 -

class Parent(models.Model):
    parent_field = models.TextField(default="parent text")

    class Meta:
        abstract = True

class Child(Parent):

    def __init__(self, *args, **kwargs):
        super(Child, self).__init__(*args, **kwargs)
        self.parent_field.default="child text"

但是,当我尝试初始化Child对象时,self.parent_field(在上面的代码中)已经是unicode对象而不是字段对象。

我知道我不应该overriding fields。我想我需要覆盖元类中的某些东西。有办法做到这一点吗?或者我只是在制造麻烦?

3 个答案:

答案 0 :(得分:8)

您将模型数据与模型元数据混淆。 字段属于元数据。它们用于装载和保存数据。 相反,模型的属性始终是数据。这就是self.parent_field是unicode对象的原因。 要访问字段对象,您需要访问模型的元数据,即self._meta对象(即class Meta中的所有内容也都在这里)。这些字段位于self._meta.fields中,这是为该类定义的django.models.Field个对象的列表。

答案 1 :(得分:2)

使用_meta.get_field,如下所示:

class Child(Parent)
    def __init__(self, *args, **kwargs):
        super(Child, self).__init__(*args, **kwargs)
        self._meta.get_field('parent_field').default="child text"

答案 2 :(得分:1)

确定我的测试和工作代码 -

class Parent(models.Model):
    parent_field = models.TextField(default="parent default")

    class Meta:
        abstract = True


class Child(Parent):

    def __init__(self, *args, **kwargs):
        for f in self._meta.fields:
            if f.attname == "parent_field":
                f.default = "child default"
        super(Child, self).__init__(*args, **kwargs)

感谢mderk。