在Django模型的初始化方法中访问父字段
我想在一个模型的初始化函数里访问它继承的字段。
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
对象的列表。