我正在尝试为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函数中。
答案 0 :(得分:0)
问题在于模型可以在视图上下文之外访问,并且DbRouters是通用的,默认情况下不是多租户。
您可以自己执行逻辑以在视图中手动选择数据库。 https://docs.djangoproject.com/en/2.2/topics/db/multi-db/#manually-selecting-a-database
如果您需要遵循更结构化的模式,则可以自己或使用django-rest之类的库来抽象很多这种逻辑。
答案 1 :(得分:0)
您可以使用 django-middleware-global-request
包 link 访问数据库路由器中的请求对象。