All Blogs

Diving into Multi-Tenancy with Django: A Deep Dive into Tenant Schemas

Published On  :   October 9, 2023

Share

Hey there, Django enthusiasts! Let's embark on a journey into the world of multi-tenancy. Today, we'll explore Django tenant schemas, demystifying both shared and private apps. Got your coffee? Great, let's dive in!

Multi-Tenancy 101

Think of multi-tenancy as a grand hotel. Each guest (tenant) gets their own suite, but they're all under the same roof. This is what Django Tenant Schemas brings to the table: a way to give every user their own unique space while sharing the same foundation.

The Charm of Django Tenant Schemas

This approach lets you host multiple clients on the same platform. Everyone shares a database, but each tenant's data is nestled safely in its own schema. It's efficient and keeps data isolated. Win-win!

Setting the Stage with Django Tenant Schemas

  1. Party Prep:

    First, let's get our tools:

    
    bashCopy code
    pip install django-tenant-schemas
    
      

  2. Laying the Groundwork:

    Tweak the settings.py:

    
    pythonCopy code
    MIDDLEWARE = [
        ...
        'tenant_schemas.middleware.TenantMiddleware',
        ...
    ]
    
    DATABASES = {
        'default': {
            ...
            'ENGINE': 'tenant_schemas.postgresql_backend',
            ...
        }
    }
      

  3. Guest List:

    Who are our tenants?

    
    pythonCopy code
    from django.db import models
    from tenant_schemas.models import TenantMixin
    
    class Client(TenantMixin):
        name = models.CharField(max_length=100)
        created_on = models.DateField(auto_now_add=True)
    
      

  4. Decorations:

    Set up the database:

    
    bashCopy code
    python manage.py makemigrations
    python manage.py migrate_schemas
    
      

Shared vs. Private Rooms (Apps!)

Imagine a communal lounge and private suites in our hotel:

  • Shared Apps: The lounges. Data here is accessible by all tenants. Things like user authentication belong here.

  • Private Apps: The suites. Data here is unique to each tenant.

Configuring this in settings.py:


pythonCopy code
SHARED_APPS = (
   'tenant_schemas',
   'myapp.users',
   ...
)

TENANT_APPS = (
   'myapp.custom_data_for_tenant',
   ...
)

INSTALLED_APPS = SHARED_APPS + TENANT_APPS
  

Shared apps' data resides in the public schema, while private apps give each tenant their unique space.

Tidbits & Pro Tips

  • Subdomain Handling: enants are often identified by subdomains. To handle this, you'll need to tweak middleware and possibly use packages like django-subdomains. Dive into the django-tenant-schemas documentation for a step-by-step guide.

  • Routing & URLs: Ensure URLs point to the right tenant. This often involves custom middleware and careful URL pattern design. Look into Django's documentation for URL configuration to master this.

  • Testing: Testing multi-tenancy can be tricky. Consider tools like pytest-django and ensure you're testing with different tenant contexts.

  • Error Scenarios: What if a tenant's subdomain doesn't exist? Ensure you have error handling in place. The middleware is your friend here!

  • Deployment: Gotchas might await when deploying multi-tenant apps, especially around database backups and scaling. A platform like Heroku has specific guides on deploying Django apps that can be invaluable.

Conclusion

Alright, fellow coder, you're now armed with the basics of Django Tenant Schemas! While this post gives you a solid foundation, remember that the devil is in the details. The django-tenant-schemas django-tenant-schemas documentation is pure gold for deep-diving into specific scenarios. Happy coding, and here's to building some fantastic multi-tenant apps!

author dp
Subhajit Mukherjee
Asst. Vice President - Growth

Multi tenant applications allow you to serve multiple customers with one install of the application. Each customer has their data completely isolated in such an architecture. Each customer is called a tenant.