Доступ к родительским полям в методе 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 4

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.