我有以下问题:
对于每个用户(或一组用户),我需要一个具有相同模型的不同数据库。我有一种方法可以找出与用户相关的数据库。问题是我总是必须对using
我进行的每个查询都使用该方法。
例如:
Thing.objects.using('appropriate_database').all()
有没有办法避免using
以某种方式使用户/数据库关系隐式使用?
我们做到了!让我解释一下。
我们编写了一个自定义的中间件,并将其注册为settings.py文件中的中间件类。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'our.custom.middleware.Class',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
该中间件具有一个process_request方法,该方法创建一个线程变量(from threading import local
)来为当前用户存储适当的数据库名称。由于每个请求都由不同的线程处理,因此我们知道变量的值不会被另一个线程意外更改。
下一步是创建数据库路由器并将其注册。
DATABASE_ROUTERS = ('our.custom.database.Router',)
注意:默认值settings.py
没有DATABASE_ROUTERS
变量。您必须创建它。
我们的定制Router
具有相同的实现了db_for_read
和db_for_write
。这些方法唯一要做的就是返回存储在线程变量中的数据库名称。
而已。现在,我们不必using
每次都需要恢复或保存模型对象时调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句