我想从模型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。我想我需要覆盖元类中的某些东西。有办法做到这一点吗?或者我只是在制造麻烦?
答案 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。