假设应用的第一页有两个链接。是否可以根据点击哪个链接来选择数据库?数据库都有相同的模型,但数据不同。例如,假设该应用程序包含不同学院的学生A
和B
。如果点击链接A
,则使用包含A
的学生的数据库A
。此后的整个应用程序应该使用大学数据库A
。基于Django中URL的动态数据库选择
我知道有些方法可以通过不同的方式设计数据库来解决这个问题,例如拥有一个大学领域,并且筛选出具有特定大学联盟的学生。但我希望找到一个解决方案,使用Django来使用两个不同的数据库。
假设应用的第一页有两个链接。是否可以根据点击哪个链接来选择数据库?数据库都有相同的模型,但数据不同。例如,假设该应用程序包含不同学院的学生A
和B
。如果点击链接A
,则使用包含A
的学生的数据库A
。此后的整个应用程序应该使用大学数据库A
。基于Django中URL的动态数据库选择
我知道有些方法可以通过不同的方式设计数据库来解决这个问题,例如拥有一个大学领域,并且筛选出具有特定大学联盟的学生。但我希望找到一个解决方案,使用Django来使用两个不同的数据库。
因此,您需要将所选数据库存储在session
或smth中,并且您可以轻松选择数据库。从docs
>>> # This will run on the 'default' database.
>>> Author.objects.all()
>>> # So will this.
>>> Author.objects.using('default').all()
>>> # This will run on the 'other' database.
>>> Author.objects.using('other').all()
是的,这是我正在寻找的东西,但是有没有替代'.using('default')'?所以基本上另一种动态选择数据库的方式? – Harvinder
@Harvinder为什么这种方法不满足你?我的意思是,如果这是在文档中,它肯定是一个不错的选择。 –
@Harvinder你也可以使用[SQLAlchemy](http://www.sqlalchemy.org/),但那是另一个故事,与django-models不兼容。 –
你可以用这个GlobalRequestMiddleware解决方案来建立这种检查找出要使用哪个数据库请求数据库路由器一起Database Routers混合。
class RequestDatabaseRouter(object):
def db_for_read(self, model, **hints):
request = GlobalRequestMiddleware.get_current_request()
key = self.get_database_key(request) # Implement get_database_key
return key
可能有某种方式注入请求转换成**hints
,我觉得这是在中间件解决方案最好,但是,我不知道怎么的时刻。您可能需要确保在AuthenticationMiddleware之后调用GlobalRequestMiddleware,否则可能没有用户请求检查。
有一个[在django文档中的页面](https://docs.djangoproject.com/en/1.10/topics/db/multi-db/),它描述了多个数据库 –
该页面上没有任何东西似乎有帮助,使用('default')'不是一个现实的解决方案。还有另一种动态选择数据库的方法吗? – Harvinder
你看过db路由器吗?只需要弄清楚如何将用户选择传递到路由器。 – serg