Reputation: 159
I want to use django to make a dashboard.
The thing is, I want to have one DB for data (that will be displayed on the dashboard) and one DB for Django operations (all the automatic tables Django creates)
I saw this answer but when I type manage.py migrate --database=data_db_name
then django creates all its automatic table also on that DB, and I dont want that. I only want this DB to be with the data to be displayed on the dashboard.
Is it possible? if so, how can I do it?
Thanks
Upvotes: 0
Views: 230
Reputation: 1129
The best approach, in this case, is to define multiple databases and use a feature by Django that is called database routing
Full documentation here
In few words:
In settings.py define multiple databases like this:
DATABASES = {
'default': {},
'read': {
'NAME': 'auth_db_name',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'swordfish',
},
'wrie': {
'NAME': 'primary_name',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'spam',
}
}
Than you have to define you own router:
class AuthRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'auth', 'contenttypes'}
def db_for_read(self, model, **hints):
"""
Attempts to read auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'read'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth and contenttypes models go to auth_db.
"""
if model._meta.app_label in self.route_app_labels:
return 'write'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth or contenttypes apps is
involved.
"""
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth and contenttypes apps only appear in the
'auth_db' database.
"""
if app_label in self.route_app_labels:
return db == 'read'
return None
Than in the settings.py
define the routers that djando needs to follow
DATABASE_ROUTERS = ['path.to.ReadRouter', 'path.to.WriteRouter']
Upvotes: 1