【问题标题】:django dynamic (multiple) databasesdjango 动态(多)数据库
【发布时间】:2014-07-16 15:28:32
【问题描述】:

我的 Django 站点是一个面向 1000 名客户的门户,因此我有一个单一的“门户”数据库,该数据库在用户表中包含给定客户的连接参数。这些是动态的,因为它们可以不时添加和删除,因此无法仅从 settings.py 文件中管理它们。

因此,“默认”数据库是一个本地数据库,一旦用户登录某些应用程序,就需要使用给定的用户数据库连接参数到该用户的后端服务器。

我需要这些应用模型来动态使用用户类中的连接设置。

我查看了许多多租户解决方案,但这些都不太适合。

我知道我可以用 app_label 装饰模型并使用自定义数据库路由器覆盖“默认”设置条目,但我不确定从那里开始。

我知道我可以编写一个附加到 settings.DATABASES 的身份验证后中间件,但我相信我已经读过这是在玩火。

有没有更简洁或更优雅的方式来处理这个问题?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    使用django.db.connections。它充当SETTINGS 中定义的DATABASES 的包装器。因此,也许您可​​以在某个地方获取中间件中的数据库设置,然后将连接添加到您的设置。

    from django.db import connections
    
    # Add connection information in middleware
    connections.databases['new-alias'] = { ... }
    
    # Use like this
    Test.objects.using('new-alias').all()
    

    类似的东西应该可以。这样做,您将只有在 settings.py 文件中定义的“门户”数据库,并且每个单独的客户端数据库都是动态定义的。

    【讨论】:

    • Test.objects.using('new-alias').all().... 你是说我必须覆盖每个需要这个的模型?
    • 您不必更改模型本身的任何内容。只需在各处引入 using 子句即可。您可以每次都将别名设置为“client-db”,这样您就可以在 using 子句中对该别名进行硬编码。
    • "everywhere" 是我失去你的地方......我猜你的意思是每个视图......我正在使用休息框架,所以我想你是在告诉我覆盖所有 ModelViewSet 方法。
    • 无论您在何处使用 Django ORM 运行查询,都使用您创建的 db 别名添加 using()。
    猜你喜欢
    • 2011-09-28
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2012-12-24
    • 2012-04-12
    • 2021-08-05
    • 2014-04-03
    相关资源
    最近更新 更多