Доступ к родительским полям в методе init модели 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"
Однако, когда я пытаюсь инициализировать дочерний объект, self.parent_field
(в коде выше) уже является объектом unicode, а не объектом field.
Я знаю, что не должен быть переопределяющим поля. Я думаю, что мне нужно будет переопределить что-то в мета-классе. Есть ли способ сделать это? Или я просто создаю проблемы?
3 ответа:
Вы путаете данные модели с метаданными модели. Поля принадлежат метаданным. Они используются при загрузке и сохранении данных. Свойства модели, напротив, всегда являются данными. Вот почему
self.parent_field
является объектом unicode. Чтобы получить доступ к полевым объектам, вам нужно получить доступ к метаданным модели, а именно к объектуself._meta
(туда же идет весь материал изclass Meta
). Поля находятся вself._meta.fields
, который представляет собой списокdjango.models.Field
объектов, определенных для класса.
Используйте
_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"
ОК мой проверенный и работающий код -
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.