0

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

orr
  • 129
  • 10
  • Set the [managed](https://docs.djangoproject.com/en/3.1/ref/models/options/#managed) flag on the model. – Klaus D. Feb 19 '21 at 15:08
  • 3
    Create a database router. see [Automatic database routing - Django docs](https://docs.djangoproject.com/en/3.1/topics/db/multi-db/#automatic-database-routing) – Abdul Aziz Barkat Feb 19 '21 at 15:18

1 Answers1

1

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']
Mattia
  • 961
  • 13
  • 25
  • Thanks, by the way, can I still use the Models functionality with the "data" DB even though it may not be "Django compatible"? – orr Feb 20 '21 at 17:34
  • use `--database=data_db_name` is totaly fine, but you need need to declare which is the DB responsible for the write/read method. Using the routing can avoid a lots of issues in the long term, because even if you forget the --, the application will follow his path .:) – Mattia Feb 22 '21 at 11:56