我的 Django 站点是一个面向 1000 名客户的门户,因此我有一个单一的“门户”数据库,在用户表中包含给定客户的连接参数。它们是动态的,因为它们可以不时添加和删除,因此无法仅通过 settings.py 文件来管理它们。
因此“默认”数据库是一个本地数据库,一旦用户登录,某些应用程序需要使用给定的用户数据库连接参数连接到该用户的后端服务器。
我需要那些应用程序模型来动态使用用户类中的连接设置。
我看过许多针对 Multi-Tenancy 的解决方案,但这些都不太适合。
我知道我可以用 app_label 装饰模型并使用自定义数据库路由器覆盖“默认”设置条目,但我不确定从哪里开始。
我看到我可以编写一个附加到 settings.DATABASES 的身份验证后中间件,但我相信我已经读过这是在玩火。
是否有更简洁或更优雅的处理方式?
请您参考如下方法:
使用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 文件中定义“门户”数据库,并且每个单独的客户端数据库都是动态定义的。
