Как переопределить значение по умолчанию для поля модели из абстрактного базового класса
У меня есть код, который выглядит следующим образом:
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