Django多个数据库映射

时间:2015-10-07 06:23:22

标签: django django-middleware

在Django中使用多个数据库时如何映射数据库,例如:从请求中有一个参数app1映射到db1,另一个请求app2映射到db2。现在,在将请求发送到视图

之前,如何选择db
df2 <- data.frame(V1=sample(df$V1, 200, replace=TRUE),
                  V2=sample(df$V2, 200, replace=TRUE))

2 个答案:

答案 0 :(得分:3)

假设我可以导入一个给我数据库的函数:

项目/应用/ views.py:

from .utils import which_db, item_search
from django.shortcuts import render
from .models import SomeModel

def some_view(request):
    obj = SomeModel.objects.using(which_db(request)).filter(**item_search(request))
    return render(request, "some_model.html", {'object':obj}

每次都要附加使用是很麻烦的。有一种方法可以将类似的查询路由到不同的数据库(更详细地记录here)。

项目/ settings.py:

DATABASE_ROUTERS = ['project.db_routes.AppRouter',]
DB_ROUTING = {'app1':'db1','app2':'db2'}

项目/ db_routes.py:

from django.conf import settings


class AppRouter:
    def __init__(self):
        self.DB = settings.DB_ROUTING

    def db_for_read(self, model, **hints):
        return self.DB.get(self.model.app_label, 'default')

    def db_for_write(self, model, **hints):
        return self.DB.get(self.model.app_label, 'default')

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model=None, **hints):
        return self.DB.get(app_label, None)

我假设您希望能够在数据库之间使用外键。如果不是,则从allow_relation返回False。 allow_migrate确保对象仅存在于其正确的数据库中。

我没有测试过这个解决方案,但它确实符合文档。

答案 1 :(得分:0)

我不完全确定你想做什么。但我的猜测是你会在这里找到答案:

https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#topics-db-multi-db-routing

如果您真的想要选择基于url(子域名e.a.)的数据库而不是编写自定义中间件类:

https://docs.djangoproject.com/en/1.8/topics/http/middleware/