如何使用数据库路由器在Django应用程序中使用多个数据库

时间:2019-04-03 15:08:38

标签: python django database

我正在尝试为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函数中。

2 个答案:

答案 0 :(得分:0)

问题在于模型可以在视图上下文之外访问,并且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/

答案 1 :(得分:0)

您可以使用 django-middleware-global-requestlink 访问数据库路由器中的请求对象。