Есть ли способ реализовать декоратор для выбора базы данных для запросов внутри функции?
У меня есть две базы данных: "default" и "replica". Я знаю, что мы можем выбрать базу данных явно, используя ".using()". Но я хочу что-то вроде этого:
@my_decorator(db_name = "replica")
def my_fun():
"""All queries in this function should perform operation on replica db"""
Есть ли какой-нибудь способ сделать это?
Для этого, вероятно, можно использовать маршрутизатор базы данных Database Router. Что-то вроде следующего должно быть осуществимо:
class DynamicRouter:
db = None
def db_for_read(self, model, **hints):
return self.db
def db_for_write(self, model, **hints):
return self.db
def my_decorator(db_name=None):
def wrapper(func):
def wrapped(*args, **kwargs):
crnt_db = DynamicRouter.db
DynamicRouter.db = db_name
return func(*args, **kwargs)
DynamicRouter.db = crnt_db
return wrapped
return wrapper
В настройках установите DATABASE_ROUTERS
настройки:
DATABASE_ROUTERS = `path.to.DynamicRouter`