我的Django站点是1000个客户的门户,因此我有一个“门户”数据库,在用户表中包含给定客户的连接参数。这些是动态的,因为它们可以不时添加和删除,因此无法从settings.py文件中管理它们。
因此“默认”数据库是本地数据库,一旦用户登录,某些应用程序需要将给定用户数据库连接参数用于该用户的后端服务器。
我需要这些应用模型动态使用用户类中的连接设置。
我看了很多针对多租户的解决方案,但这些解决方案并不适合。
我知道我可以用app_label装饰模型并使用自定义数据库路由器覆盖“默认”设置条目,但我不知道从那里做什么。
我看到我可以编写一个附加到settings.DATABASES的认证后中间件,但我相信我已经读到这是在玩火。
是否有更清洁或更优雅的处理方式?
答案 0 :(得分:3)
使用django.db.connections
。它充当DATABASES
中定义的SETTINGS
的包装器。因此,您可以在某处获取中间件中的数据库设置,然后添加与您的设置的连接。
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
文件中定义“门户”数据库,并且每个客户端数据库都是动态定义的。