Parcourir la source

完善路由表配置

locky il y a 3 ans
Parent
commit
d0fd33898c
2 fichiers modifiés avec 81 ajouts et 1 suppressions
  1. 80 0
      Ansjer/cn_config/test_database_router.py
  2. 1 1
      Ansjer/cn_config/test_settings.py

+ 80 - 0
Ansjer/cn_config/test_database_router.py

@@ -0,0 +1,80 @@
+# database_router.py
+from Ansjer.cn_config import test_settings
+
+DATABASE_MAPPING = test_settings.DATABASE_APPS_MAPPING
+
+
+class DatabaseAppsRouter(object):
+    """
+    A router to control all database operations on models for different
+    databases.
+DATABASE_ROUTERS DATABASE_ROUTERS
+    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 model._meta.app_label in DATABASE_MAPPING:
+            return DATABASE_MAPPING[model._meta.app_label]
+        return None
+
+    def db_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]
+        return None
+
+    def allow_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:
+                return True
+            else:
+                return False
+        return None
+
+    def allow_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:
+            return False
+        return None
+
+    def allow_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:
+            return False
+        return None
+
+    # for Django 1.4 - Django 1.6
+    def allow_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:
+            return False
+        return None
+
+    # Django 1.7 - Django 1.11
+    def allow_migrate(self, db, app_label, model_name=None, **hints):
+
+        if db in DATABASE_MAPPING.values():
+            return DATABASE_MAPPING.get(app_label) == db
+        elif app_label in DATABASE_MAPPING:
+            return False
+        return None

+ 1 - 1
Ansjer/cn_config/test_settings.py

@@ -112,7 +112,7 @@ DATABASES = {
     },
 }
 
-DATABASE_ROUTERS = ['Ansjer.database_router.DatabaseAppsRouter']
+DATABASE_ROUTERS = ['test_database_router.DatabaseAppsRouter']
 DATABASE_APPS_MAPPING = {
     'Model': 'default',
     'db2': 'mysql02',