Easy to create applications that use tenants in django
This is a Django app for managing multiple tenants on the same project instance using a shared approach.
There are typically three solutions for solving the multitenancy problem:
- Isolated Approach: Separate Databases. Each tenant has it’s own database.
- Semi Isolated Approach: Shared Database, Separate Schemas. One database for all tenants, but one schema per tenant.
- Shared Approach: Shared Database, Shared Schema. All tenants share the same database and schema. There is a main tenant-table, where all other tables have a foreign key pointing to.
This application implements the third approach, which in our opinion, is the best solution for a large amount of tenants.
For more information: Building Multi Tenant Applications with Django
Below is a demonstration of the features in each approach for an application with 5000 tenants.
|Approach||Number of DB||Number of Schemas||Django migration time||Public access|
|Semi Isolated||1||5000||slow (1/Schema)||Yes|
Assuming you have django installed, the first step is to install
python -m pip install django-easy-tenants
Now you can import the tenancy module in your Django project.
It is recommended to install this app at the beginning of a project. In an existing project, depending on the structure of the models, the data migration can be hard.
easy_tenants to your
INSTALLED_APPS = [ ..., 'easy_tenants', ]
Create a model which will be the tenant of the application.
from django.db import models class Customer(models.Model): ...
Define on your
settings.py which model is your tenant model. Assuming you created
inside an app named
yourapp, your EASY_TENANTS_MODEL should look like this:
EASY_TENANTS_MODEL = 'yourapp.Customer'
Your models, that should have data isolated by tenant, need to inherit from
and the objects need to be replaced by
from django.db import models from easy_tenants.models import TenantAbstract from easy_tenants.managers import TenantManager class Product(TenantAbstract): name = models.CharField(max_length=10) objects = TenantManager()
To obtain the data for each tenant, it is necessary to define which tenant will be used:
from easy_tenants import tenant_context with tenant_context(customer): Product.objects.all() # filter by customer
To define the tenant to be used, this will depend on the business rule used. Here is an example for creating middleware that defines a tenant:
from django.http import HttpResponse from easy_tenants import tenant_context class TenantMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): customer = get_customer_by_request(request) if not customer: return HttpResponse("Select tenant") with tenant_context(customer): return self.get_response(request)
If you want to separate the upload files by tenant, you need to change the
configuration (only available for local files).
DEFAULT_FILE_STORAGE = 'easy_tenants.storage.TenantFileSystemStorage'
Running the example project
python manage.py migrate python manage.py createsuperuser python manage.py shell # create 2 customers and include user in customer python manage.py runserver
Access the page
/admin/, create a
Customer and then add a user on the created
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size||File type||Python version||Upload date||Hashes|
|Filename, size django_easy_tenants-0.6.0-py3-none-any.whl (7.7 kB)||File type Wheel||Python version py3||Upload date||Hashes View|
|Filename, size django-easy-tenants-0.6.0.tar.gz (7.0 kB)||File type Source||Python version None||Upload date||Hashes View|
Hashes for django_easy_tenants-0.6.0-py3-none-any.whl
Hashes for django-easy-tenants-0.6.0.tar.gz