From 6a883182218aae6c9b62738fa5b3ccb600351291 Mon Sep 17 00:00:00 2001 From: wuyue Date: Sun, 22 Apr 2018 13:18:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=B7=AF=E7=94=B1=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rest_backend/settings/base.py | 8 ++++ rest_backend/utils/__init__.py | 0 rest_backend/utils/database_router.py | 58 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 rest_backend/utils/__init__.py create mode 100644 rest_backend/utils/database_router.py diff --git a/rest_backend/settings/base.py b/rest_backend/settings/base.py index 76e20f9..ec58c6a 100644 --- a/rest_backend/settings/base.py +++ b/rest_backend/settings/base.py @@ -97,6 +97,14 @@ } } +# 添加路由 +DATABASE_ROUTERS = ['rest_backend.utils.database_router.DatabaseAppsRouter'] +DATABASE_APPS_MAPPING = { + # example: + # 'app_name':'database_name', + 'accounts': 'default', +} + # Password validation # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators diff --git a/rest_backend/utils/__init__.py b/rest_backend/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rest_backend/utils/database_router.py b/rest_backend/utils/database_router.py new file mode 100644 index 0000000..9147d01 --- /dev/null +++ b/rest_backend/utils/database_router.py @@ -0,0 +1,58 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +""" +@author: wuyue +@contact: wuyue92tree@163.com +@software: PyCharm +@file: database_router.py +@create at: 2018-04-22 12:53 + +这一行开始写关于本文件的说明与解释 +""" + +from django.conf import settings + +DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING + + +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 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