Как использовать несколько баз данных в приложении Django, используя Database Router - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь реализовать поддержку нескольких баз данных для моего django существующего приложения. Я уже попробовал подход, представленный в официальной документации dajngo. Но мое требование совершенно отличается от того, что указано в документации.

В функциях django вы можете вызывать request.session. ['User'] и выполнять действия на его основе. В моем случае я хотел бы иметь возможность переключать базы данных в зависимости от переменной сеанса, назначенной во время входа в систему.

Есть ли в любом случае, чтобы добавить запрос / сеанс в методы db_for_read () и db_for_write (), как в следующем

class DataBaseRouter:
    def db_for_read(self, model, **hints):
        if request.session['user'] == "Some value":
            return "master"
        return "default"

    def db_for_write(self, model, **hints):
        if request.session['user'] == "Some value":
            return "master"
        return "default"

В настоящее время я использую Django 2.0.1, и я попробовал следующий код, я не уверен, что это правильный подход или нет, вот что я реализовал, и я не смог получить доступ к объектам сеанса или запроса.

from django.http import HttpRequest

class DataBaseRouter:
    def db_for_read(self, model, **hints):
        request = HttpRequest()
        if request.session['user']=="Value":
            return 'second'
        return first

    def db_for_write(self, model, **hints):
       request = HttpRequest()
        if request.session['user']=="Value":
            return 'second'
        return first

Я ожидаю получить доступ к переменным Session или объекту запроса точно так же, как мы можем получить к ним доступ в Views или способе добавления объекта запроса в функции db_for_read и db_for_write класса маршрутизатора базы данных.

1 Ответ

0 голосов
/ 03 апреля 2019

Проблема в том, что к моделям можно обращаться вне контекста представления, а DbRouters являются универсальными, а не мультитенантными по умолчанию.

Вы можете самостоятельно выполнить логику, чтобы вручную выбрать базу данных вваши взгляды.https://docs.djangoproject.com/en/2.2/topics/db/multi-db/#manually-selecting-a-database

Вы можете абстрагировать большую часть этой логики либо самостоятельно, либо с помощью библиотеки, например, django-rest, если вам нужен более структурированный шаблон, которому нужно следовать.

https://www.django-rest-framework.org/api-guide/viewsets/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...