Администрирование различных баз данных приложения с помощью django
Я понимаю, как работать с несколькими базами данных через маршрутизаторы, однако, как быть, если у меня есть две базы данных с одинаковой структурой, но требуется сохранить информацию в соответствии с базой данных, выбранной пользователем при запуске сессии. У меня есть логин сессии с соответствующим именем пользователя и паролем, кроме того, обязательно, чтобы пользователь выбрал базу данных через селектор для корректного начала сессии с приложением, эта информация об имени выбранной базы данных перемещается через куки сессии для всей сессии (простите за избыточность), все операции приложения должны выполняться на базе данных, которая была первоначально выбрана в логине доступа, как правильно маршрутизировать базы данных для этого случая?
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_ZF'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),
'HOST': 'localhost',
'PORT': '3306',
},
'SBOJOZF': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_ZF'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),
'HOST': 'localhost',
'PORT': '3306',
},
'SBOJOCOL': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_COL'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),
'HOST': 'localhost',
'PORT': '3306',
}
}
Я предполагаю, что вы спрашиваете о маршрутизации к нескольким базам данных, простите, если это не ваш вопрос. Думаю, вам нужен конвертер.
В вашем urls.py
:
from django.urls import path, register_converter
register_converter(convertors.DatabaseNameConverter, 'db_name')
urlpatterns = [
path('<db_name:db_name>/', views.example_view),
]
Тогда в convertors.py
:
from django.conf import settings
class DatabaseNameConverter:
"""
Regex converter for URL that takes all available names of databases for routing.
"""
regex = '('+')|('.join(settings.DATABASES.keys())+')'
def to_python(self, value):
return str(value)
def to_url(self, value):
return str(value)
Тогда это просто параметр запроса, который вы можете использовать в своем представлении, вот пример представления:
def example_view(request, db_name):
users = User.objects.using(db_name).all()
# Other code
В качестве альтернативы вы можете проверить, какую базу данных вы используете, чтобы знать, как делать запросы: db_name == "default"