rahnama7m
rahnama7m

Reputation: 977

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.

Upvotes: 2

Views: 1686

Answers (2)

AKX
AKX

Reputation: 168913

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

Upvotes: 6

Syed Mohammad Hosseini
Syed Mohammad Hosseini

Reputation: 522

Because of the concept and effect of some fields in meta section in many cases it doesn't make sense that the field is inherited by chidren.

It has been described here

Upvotes: 5

Related Questions