在Django模型的初始化方法中访问父字段

5 投票
3 回答
6187 浏览
提问于 2025-04-17 16:05

我想在一个模型的初始化函数里访问它继承的字段。

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"

但是当我尝试创建一个子对象时,self.parent_field(上面的代码)已经变成了一个unicode对象,而不是一个字段对象。

我知道我不应该去< a href="https://docs.djangoproject.com/en/1.4/topics/db/models/#field-name-hiding-is-not-permitted" rel="noreferrer">覆盖字段。我想我可能需要在元类里做一些修改。有没有办法做到这一点?还是说我只是自找麻烦?

3 个回答

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 的帮助。

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"
9

你把模型的数据和模型的元数据搞混了。字段是属于元数据的,它们在加载和保存数据的时候用得上。而模型的属性,反过来说,始终是数据。这就是为什么self.parent_field是一个unicode对象的原因。

如果你想访问字段对象,你需要去查看模型的元数据,也就是self._meta对象(这里面也包含了class Meta里的所有内容)。字段在self._meta.fields里面,这里是一个包含了为这个类定义的django.models.Field对象的列表。

撰写回答