Есть ли способ реализовать декоратор для выбора базы данных для запросов внутри функции?

У меня есть две базы данных: "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`
Вернуться на верх