Django supports working with multiple databases in a single project. This is useful for separating read/write databases, integrating legacy databases, or handling data from various sources. This guide explains how to configure and manage multiple databases in Django.
using() to target a specific database.DATABASES setting to define multiple database connections.
# settings.py - defining multiple databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'primary_db',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '5432',
},
'secondary': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'secondary_db',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '5433',
}
}
# routers.py - routing reads and writes
class PrimaryDatabaseRouter:
def db_for_read(self, model, **hints):
return 'default'
def db_for_write(self, model, **hints):
return 'default'
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
return db == 'default'
class SecondaryDatabaseRouter:
def db_for_read(self, model, **hints):
return 'secondary'
def db_for_write(self, model, **hints):
return 'secondary'
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
return db == 'secondary'
# views.py - querying specific databases
from django.shortcuts import render
from myapp.models import Model1, Model2
def view_function(request):
primary_data = Model1.objects.using('default').all()
secondary_data = Model2.objects.using('secondary').all()
return render(request,'template.html',{
'primary_data': primary_data,
'secondary_data': secondary_data
})
# Conceptual flow diagram
User Request
↓
Django ORM
↓
Database Router
↙ ↘
Primary DB Secondary DB
Click a Django operation to see how the Router directs traffic to the correct database.
using() calls for critical queries.--database flag.