INSTALLED_APPS += ['tenant_schemas']
DATABASE_ROUTERS = ['tenant_schemas.routers.TenantSyncRouter']
MIDDLEWARE = [
'tenant_schemas.middleware.TenantMiddleware',
# Other middleware
]
TENANT_MODEL = 'customers.Client'
TENANT_DOMAIN_MODEL = 'customers.Domain'
SHARED_APPS = [
'tenant_schemas',
'customers',
'django.contrib.contenttypes',
'django.contrib.auth',
]
TENANT_APPS = [
'django.contrib.admin',
'blog',
'shop',
# Apps with tenant-specific data
]
INSTALLED_APPS = list(set(SHARED_APPS + TENANT_APPS))
from tenant_schemas.models import TenantMixin, DomainMixin
from django.db import models
class Client(TenantMixin):
name = models.CharField(max_length=100)
created_on = models.DateField(auto_now_add=True)
auto_create_schema = True
class Domain(DomainMixin):
pass
Multi-tenancy allows multiple clients to share one application with isolated data. I use django-tenant-schemas for PostgreSQL schema-based isolation. Each tenant gets a separate schema (database namespace). The middleware routes requests to correct tenant based on domain or subdomain. Shared models go in public schema. This is more efficient than separate databases per tenant. I handle tenant creation with management commands. For simpler needs, row-level tenant filtering might suffice. This architecture scales to thousands of tenants.