基于Django中URL的动态数据库选择

时间:2016-09-22 17:10:15

标签: python django django-models

假设该应用的第一页有两个链接。是否可以根据点击的链接选择数据库?数据库都具有相同的模型,但数据不同。例如,假设该应用程序包含不同大学AB的学生。如果点击A的链接,则会使用A的数据库,其中包含大学A的学生。此后的整个申请应使用大学数据库A

我知道有办法解决这个问题,只是设计不同的数据库,即拥有一个大学领域,并过滤掉具有特定大学附属关系的学生。但我希望找到一个使用Django的解决方案来使用两个不同的数据库。

2 个答案:

答案 0 :(得分:1)

因此,您需要将所选数据库存储在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()

答案 1 :(得分:0)

您可以将Database Routers与此GlobalRequestMiddleware解决方案混合在一起,以创建一个数据库路由器,检查请求以确定要使用的数据库。

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,否则您可能没有请求用户进行检查。