【问题标题】:How to use Multiple Databases in Django Application using Database Router如何使用数据库路由器在 Django 应用程序中使用多个数据库
【发布时间】:2019-08-25 04:16:50
【问题描述】:

我正在尝试为我的 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 变量或请求对象,就像我们可以在视图中访问它们一样,或者将请求对象注入到数据库路由器类的 db_for_read 和 db_for_write 函数中。

【问题讨论】:

标签: python django database


【解决方案1】:

问题是模型可以在视图上下文之外访问,而 DbRouter 是通用的,默认情况下不是多租户。

您可以自己执行逻辑以在视图中手动选择数据库。 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/

【讨论】:

  • 我们可以在模型级别更改/添加新变量到模型元类,以便我们可以访问它们
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多