from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
classDatabaseAppsRouter(object):"""
A router to control all database operations on models for different
databases.
In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app01': 'default', 'app02': 'db02'}
"""defdb_for_read(self, model,**hints):""""Point all read operations to the specific database."""if model._meta.app_label in DATABASE_MAPPING:return DATABASE_MAPPING[model._meta.app_label]returnNonedefdb_for_write(self, model,**hints):"""Point all write operations to the specific database."""if model._meta.app_label in DATABASE_MAPPING:return DATABASE_MAPPING[model._meta.app_label]returnNonedefallow_relation(self, obj1, obj2,**hints):"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)if db_obj1 and db_obj2:if db_obj1 == db_obj2:returnTrueelse:returnFalsereturnNonedefallow_syncdb(self, db, model):"""Make sure that apps only appear in the related database."""if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(model._meta.app_label)== db
elif model._meta.app_label in DATABASE_MAPPING:returnFalsereturnNonedefallow_migrate(self, db, app_label, model=None,**hints):"""
Make sure the auth app only appears in the 'auth_db'
database.
"""if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(app_label)== db
elif app_label in DATABASE_MAPPING:returnFalsereturnNone# for Django 1.4 - Django 1.6defallow_syncdb(self, db, model):"""Make sure that apps only appear in the related database."""if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(model._meta.app_label)== db
elif model._meta.app_label in DATABASE_MAPPING:returnFalsereturnNone# Django 1.7 - Django 1.11defallow_migrate(self, db, app_label, model_name=None,**hints):print(db, app_label, model_name, hints)if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(app_label)== db
elif app_label in DATABASE_MAPPING:returnFalsereturnNone