如何根据Django中的登录状态使用不同的数据库?

Rya*_*zel 4 django

基本上,如果用户登录时不必担心复制延迟,我们希望他们读/写主服务器; 但如果用户未登录,我们希望他们从副本中读取并写入主服务器.使用Django路由器可以吗?

Che*_*wie 5

这可能是不好的做法,但是在代码中的任何时候,只要你使用Django> = 1.2,使用using()方法和using关键字,你就可以完全控制哪个数据库选择你的QuerySet并进行保存和删除.

例如,对于QuerySet:

>>> MyModel.objects.using('replica').all()
Run Code Online (Sandbox Code Playgroud)

或保存对象:

>>> my_object.save(using='master')
Run Code Online (Sandbox Code Playgroud)

所以你总是可以在视图中做这样的事情:

query_set = MyModel.objects.all()

if request.user.is_authenticated():
    query_set = query_set.using('master')
Run Code Online (Sandbox Code Playgroud)

但这可能会变得非常麻烦,如果你决定走这条路,你应该寻求一种更优雅的方法来缓解它.我想到了信号,中间件和/或模型管理器.

请参阅从Django文档中手动选择数据库.