database_router.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # database_router.py
  2. from django.conf import settings
  3. DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
  4. class DatabaseAppsRouter(object):
  5. """
  6. A router to control all database operations on models for different
  7. databases.
  8. DATABASE_ROUTERS DATABASE_ROUTERS
  9. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
  10. will fallback to the `default` database.
  11. Settings example:
  12. DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
  13. """
  14. def db_for_read(self, model, **hints):
  15. """"Point all read operations to the specific database."""
  16. if model._meta.app_label in DATABASE_MAPPING:
  17. return DATABASE_MAPPING[model._meta.app_label]
  18. return None
  19. def db_for_write(self, model, **hints):
  20. """Point all write operations to the specific database."""
  21. if model._meta.app_label in DATABASE_MAPPING:
  22. return DATABASE_MAPPING[model._meta.app_label]
  23. return None
  24. def allow_relation(self, obj1, obj2, **hints):
  25. """Allow any relation between apps that use the same database."""
  26. db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
  27. db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
  28. if db_obj1 and db_obj2:
  29. if db_obj1 == db_obj2:
  30. return True
  31. else:
  32. return False
  33. return None
  34. def allow_syncdb(self, db, model):
  35. """Make sure that apps only appear in the related database."""
  36. if db in DATABASE_MAPPING.values():
  37. return DATABASE_MAPPING.get(model._meta.app_label) == db
  38. elif model._meta.app_label in DATABASE_MAPPING:
  39. return False
  40. return None
  41. def allow_migrate(self, db, app_label, model=None, **hints):
  42. """
  43. Make sure the auth app only appears in the 'auth_db'
  44. database.
  45. """
  46. if db in DATABASE_MAPPING.values():
  47. return DATABASE_MAPPING.get(app_label) == db
  48. elif app_label in DATABASE_MAPPING:
  49. return False
  50. return None
  51. # for Django 1.4 - Django 1.6
  52. def allow_syncdb(self, db, model):
  53. """Make sure that apps only appear in the related database."""
  54. if db in DATABASE_MAPPING.values():
  55. return DATABASE_MAPPING.get(model._meta.app_label) == db
  56. elif model._meta.app_label in DATABASE_MAPPING:
  57. return False
  58. return None
  59. # Django 1.7 - Django 1.11
  60. def allow_migrate(self, db, app_label, model_name=None, **hints):
  61. if db in DATABASE_MAPPING.values():
  62. return DATABASE_MAPPING.get(app_label) == db
  63. elif app_label in DATABASE_MAPPING:
  64. return False
  65. return None