djangodjango-modelsdjango-inheritance

Why Abstract=True dosen't inherit in Meta class of django model


I we have this models in django:

class FotherModel(models.Model):
    # Some fields goes here! 
    class Meta: 
        # Some fields goes here! 
        abstract = True 
class ChildModel(FotherModel):
    # Some fields goes here! 
    class Meta(FotherModel.Meta):
        #s Some fields goes here! 

When we inherit a field from the meta class of Django models, that field appears in child meta class, But this rule does not apply to abstract=True.

I know that if this happens, no table in database will be created, But I don't know how this inheritance didn't happen. Please explain this process for me.


Solution

  • The Model metaclass resets abstract in a model's Meta class. In this document you can see:

    Django does make one adjustment to the Meta class of an abstract base class: before installing the Meta attribute, it sets abstract=False. This means that children of abstract base classes don’t automatically become abstract classes themselves.

    Also, you can see the source code of this process in this link:

    if abstract:
        # Abstract base models can't be instantiated and don't appear in
        # the list of models for an app. We do the final setup for them a
        # little differently from normal models.
        attr_meta.abstract = False
        new_class.Meta = attr_meta
        return new_class