How to override the default value of a Model Field from an Abstract Base Class

You can actually do this as follows:

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

I have done this once or twice. It works, because the field on Message is a different instance than the field on BaseMessage. However, I doubt it’s recommended 😉 It depends a lot on how django internals currently work, so there’s no guarantee that it will work forever.

Leave a Comment