Django数据库路由器

时间:2012-03-11 08:12:27

标签: python django saas

我想根据经过身份验证的用户路由(更改)数据库。我查看了docs,但我不知道如何在用户登录时执行此操作...

我正在考虑将database_name字段添加到我的自定义UserProfile中,然后我想将此信息传递给数据库路由器,以便进行切换...

我没有要显示的代码,因为我根本不知道如何实现它。

此帖以某种方式与我之前的post相关。

所以架构就像:

- Users (containing only the `UserProfile`)
 - user1 (containing the app database)
 - user2 (containing the app database)
 - ...

你能指出我正确的方向吗?

谢谢! BR

2 个答案:

答案 0 :(得分:1)

即使在SaaS应用程序中这是一个典型的请求,多租户通常也有点难以做到,而不会扭曲django。这是一个描述一个approach的链接,在我工作的公司开发的那个有点不同,攻击contrib.sites,但数据库部分非常相似。

简而言之,如果你想要数据库多租户,你将不得不破解Django ConnectionHandler来做你想做的事。

答案 1 :(得分:1)

请参阅this帖子,了解如何使用路由器

DATABASE_ROUTERS = ['CustomDatabaseRouter',] #a setting that Django understands.

class CustomDatabaseRouter(object):

  def db_for_read(self, model, **hints):
     site_name = get_current_site()
     if site_name  in ['site1']:
         return 'db1'
     if site_name in ['site2']:
        return 'db2'
     return 'default'

  def db_for_write(self, model, **hints):
     site_name = get_current_site()
     if site_name  in ['site1']:
         return 'db1'
     if site_name in ['site2']:
        return 'db2'
     return 'default'

  def allow_syncdb(self, model, **hints):
     site_name = get_current_site()
     if site_name in ['site1'] and db == 'db1':
         return True
     if site_name in ['site2'] and db == 'db2':
        return True
     return False