Как переопределить значение по умолчанию для поля модели из абстрактного базового класса

У меня есть код, который выглядит следующим образом:

class BaseMessage(models.Model):
    is_public = models.BooleanField(default=False)
    # some more fields...

    class Meta:
        abstract = True

class Message(BaseMessage):
    # some fields...

и я хотел бы переопределить значение по умолчанию is_public поле в модели сообщения, так что это True для этой модели.

Я просмотрел некоторые релевантные документы по Django и просмотрел объекты модели, но у меня возникли проблемы с поиском подходящего места для этого. Какие-либо предложения?

2 ответа

Вы можете сделать это следующим образом:

class BaseMessage(models.Model):
    is_public = models.BooleanField(default=False)
    # some more fields...

    class Meta:
        abstract = True

class Message(BaseMessage):
    # some fields...
Message._meta.get_field('is_public').default = True

Я сделал это один или два раза. Это работает, потому что поле в сообщении отличается от поля в BaseMessage. Однако я сомневаюсь, что это рекомендуется;-) Это во многом зависит от того, как в настоящее время работают внутренние компоненты django, поэтому нет гарантии, что это будет работать вечно.

Для перегрузки уровня проверки, например max_length можно добавить это в apps.py ready метод

      from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _


class MyAppConfig(AppConfig):
    name = "myapp"
    verbose_name = _("myapp")

    def ready(self):
        from myapp.models import MyModel

        # HACK: to set max_length for field when you can't change
        # this on parent model for example when inheriting from third
        # party app
        MyModel._meta.get_field('field').max_length = 128
Другие вопросы по тегам