5

我想从该模型的 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 对象而不是字段对象。

我知道我不应该覆盖 fields。我想我需要覆盖元类中的某些内容。有没有办法做到这一点?还是我只是在找麻烦?

4

3 回答 3

9

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

于 2013-02-16T15:29:36.600 回答
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"
于 2015-04-20T09:47:46.917 回答
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。

于 2013-02-16T16:35:37.237 回答