Django, Databases, and Decorators
有一个解决方案使用
django DATABASE_ROUTERS
.
Here
你可以从中找到一个例子
docs.djangoproject.com
. 下面是来自“django,databases,and decorators”的摘要:
1。编写自定义装饰器
在这里命名
decorator
作为
decorators.py
:
from functools import wraps
try:
from threading import local
except ImportError:
from _threading_local import local
threadlocal = local()
class use_db_for_reads(object):
def __init__(self, database_name):
self.database_name = database_name
def __enter__(self):
setattr(threadlocal, 'DB_FOR_READ_ONLY', self.database_name)
def __exit__(self, exc_type, exc_value, traceback):
setattr(threadlocal, 'DB_FOR_READ_ONLY', None)
def __call__(self, test_func):
@wraps(test_func)
def inner(*args, **kwargs):
return test_func(*args, **kwargs)
return inner
def get_thread_local(attr, default=None):
return getattr(threadlocal, attr, default)
class AnalyticsRouter(object):
def db_for_read(self, model, **hints):
return get_thread_local('DB_FOR_READ_ONLY', 'default')
def db_for_write(self, model, **hints):
return 'default'
def allow_relation(self, obj1, obj2, **hints):
return True
2。更新设置
下面是一个例子
DATABASES
在里面
settings.py
:
DATABASES = {
'default': {
...
},
'read-only': {
...
}
}
DATABASE_ROUTERS = ['decorators.AnalyticsRouter']
三。下面是如何使用它
from decorators import use_db_for_reads
# Here call method() using DATABASE_A
with use_db_for_reads(DATABASE_A):
method()
# here call method() using DATABASE_B
with use_db_for_reads(DATABASE_B):
method()