Django, the popular web framework for Python, provides a powerful and flexible way to define and work with databases through its Object-Relational Mapping (ORM) system. One of the powerful features of Django’s ORM is model inheritance. In this article, we will explore the concept of Django model inheritance, discuss the different types of model inheritance, and show you step-by-step how to create subclasses of models.

Why Use Model Inheritance?

Before diving into the technical aspects, let’s understand why you might need model inheritance in Django and the benefits it offers:

1. Code Reusability:

Model inheritance allows you to reuse fields and methods from an existing model in new models. This can significantly reduce code duplication and make your application more maintainable.

2. Organization and Structure:

Inheritance can help you create a logical and structured hierarchy of models. This is particularly useful when you have multiple models that share common attributes but also have some distinct properties.

3. Simplified Queries:

Inherited models share the same database table, making it easier to perform queries and aggregations across related models.

Now, let’s dive into the steps to create subclasses of models in Django.

Step 1: Create a Base Model

First, create a base model that contains the common fields and methods you want to share across multiple models. Here’s an example:

from django.db import models

class BaseModel(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True

In this example, BaseModel includes a name field and a created_at field, which can be used by any model that inherits from it. The Meta class with abstract = True ensures that BaseModel is not created as a standalone database table.

Step 2: Create Subclasses

Now, let’s create subclasses that inherit from the BaseModel and add additional fields specific to each subclass. For instance, we’ll create two subclasses: Person and Company.

class Person(BaseModel):
    age = models.PositiveIntegerField()
    address = models.CharField(max_length=200)

class Company(BaseModel):
    industry = models.CharField(max_length=100)
    size = models.PositiveIntegerField()

In this step, we extend the BaseModel to create the Person and Company models. Each of these subclasses inherits the name and created_at fields from BaseModel and adds its own specific fields.

Step 3: Run Migrations

To apply these model changes to your database, you need to create and run migrations. Open your terminal and run:

python makemigrations
python migrate

This will generate the necessary database tables for BaseModel, Person, and Company. The common fields will be stored in the same table, which simplifies queries.

Step 4: Use Inherited Models

Now that you have created the inherited models, you can start using them in your views, forms, and templates just like any other Django model. For example, you can create instances of Person and Company and save them to the database:

# Creating and saving a Person instance
person = Person(name="John Doe", age=30, address="123 Main St")

# Creating and saving a Company instance
company = Company(name="Acme Inc.", industry="Tech", size=1000)

Step 5: Querying Inherited Models

Querying inherited models is straightforward. You can use the common fields and specific fields in your queries:

# Retrieve all people aged 30
people = Person.objects.filter(age=30)

# Retrieve all companies in the "Tech" industry
tech_companies = Company.objects.filter(industry="Tech")

Django’s ORM takes care of joining the related tables when necessary, making it seamless for you to work with inherited models.


Django model inheritance is a powerful feature that allows you to create a structured and organized database schema while reducing code redundancy. By following the steps outlined in this article, you can create subclasses of models that inherit common fields and methods, making your Django application more maintainable and efficient.

So, the next time you find yourself in a situation where you need to share attributes between models, consider using model inheritance to streamline your development process and improve code reusability in your Django project.


I am a Full-Stack Web Developer & Security Analyst from Bangladesh. I have built web/online applications on various Open Source Stacks and love information security testing.

Leave A Reply