Наследование абстрактной модели Django - обнуляйте все поля - PullRequest
1 голос
/ 13 марта 2019

У меня есть AbstractModel, Model и DraftModel.

Мне нужно DraftModel для наследования от AbstractModel, но все поля inherited должны быть null=True. Я не могу изменить Model поля на null=True, так как на этом построено слишком много логики.

Я предпочитаю не переопределять вручную все поля.

Я пытался:

    def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    for field in self._meta.fields:
        field.null = True

Что не работает, у вас есть идеи?

EDIT

Я нашел одно решение (проверьте мой ответ), но вы готовы добавить свое.

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Изменение полей внутри __init__ не работает, потому что нет вызова.

Добавление этого фрагмента под DrafModel works:

for field in DraftModel._meta.fields:
    field.null = True

Конечно, вы должны исключить такие поля, как PrimaryKey или BooleanField

EDIT

Для моих целей это работает:

for field in DraftModel._meta.fields:
     if not field.primary_key and not isinstance(field, models.BooleanField):
          field.null = True
0 голосов
/ 13 марта 2019

Вы можете переопределить метод __call__:

class DraftModel(SomeAbstractModel):

    def __call__(self, *args, **kwargs):
        for f in self.__class__._meta.fields:
            if f.name not in ['id'] and not isinstance(f, models.BooleanField):  # copy pasted from your answer
                f.null = True
        super(DraftModel, self).__call__(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...