Как установить значение инициализации на абстрактном Django mixin из конкретного класса - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть абстрактный класс mixin, который добавляет поле модели Django к любому конкретному классу, который наследует его.

При инициализации класса - когда запускается makemigrations - я бы хотел, чтобы наследующий класс определилявляется ли унаследованное поле обязательным или необязательным с помощью свойства blank= True или False.

Я пробовал различные Meta и __new__ подходы, но не могу понять, какабстрактный класс mixin может получить информацию от наследующего класса.

Вот наивная попытка:

from django.db import models


class DescriptionMixin(models.Model):

    class Meta:
        abstract = True

    description = models.TetxField(
        # how to get value here?
        blank=inheriting_class.description_required
    )


class OptionalDescription(DescriptionMixin, SomeOtherClass):

    class Meta:
        verbose_name = 'Optional description'

    description_required = False


class RequiredDescription(DescriptionMixin, SomeOtherClass):

    class Meta:
        verbose_name = 'Required description'

    description_required = True

Заранее благодарим за любую предложенную помощь.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Решено с помощью этого (на самом деле это трясогузка на вершине Django):

def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)   
    self._meta.get_field('description').blank = not getattr(self, 'description_required', False)
0 голосов
/ 16 сентября 2018

Вы не можете сделать это на уровне базы данных.makemigrations на самом деле не инициализирует ваши модели для создания файлов миграции.

Но так как вы пытаетесь применить это на TextField, который в любом случае не может быть применен на уровне базы данных (blankиспользуется только при проверке модели с помощью метода full_clean()), вы можете просто переопределить метод clean() на DescriptionMixin, проверяя значение self.blank и соответственно увеличивая ValidationError.

...