Last active
September 16, 2023 14:57
-
-
Save aljiwala/c1e28d65a2e3cb030c877479f1139284 to your computer and use it in GitHub Desktop.
Django Database Router using Settings
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.conf import settings | |
class DatabaseAppsRouter(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 = {'app1': 'db1', 'app2': 'db2'} | |
""" | |
def db_for_read(self, model, **hints): | |
""""Point all read operations to the specific database.""" | |
if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label): | |
return settings.DATABASE_APPS_MAPPING[model._meta.app_label] | |
return None | |
def db_for_write(self, model, **hints): | |
"""Point all write operations to the specific database.""" | |
if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label): | |
return settings.DATABASE_APPS_MAPPING[model._meta.app_label] | |
return None | |
def allow_relation(self, obj1, obj2, **hints): | |
"""Allow any relation between apps that use the same database.""" | |
db_obj1 = settings.DATABASE_APPS_MAPPING.get(obj1._meta.app_label) | |
db_obj2 = settings.DATABASE_APPS_MAPPING.get(obj2._meta.app_label) | |
if db_obj1 and db_obj2: | |
if db_obj1 == db_obj2: | |
return True | |
else: | |
return False | |
return None | |
def allow_migrate(self, db, model): | |
return True | |
def allow_syncdb(self, db, model): | |
"""Make sure that apps only appear in the related database.""" | |
if db in settings.DATABASE_APPS_MAPPING.values(): | |
return settings.DATABASE_APPS_MAPPING.get(model._meta.app_label) == db | |
elif settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label): | |
return False | |
return None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment