Маршрутизатор базы данных Django - PullRequest
1 голос
/ 11 марта 2012

Я хотел бы направить (изменить) базу данных на основе аутентифицированного пользователя. Я посмотрел на документы , но я не знаю, как это сделать при входе пользователя ...

Я думал добавить поле с database_name в свой пользовательский UserProfile, а затем я хотел бы передать эту информацию маршрутизатору базы данных, который сделает переключение ...

У меня нет кода для показа, потому что я просто не знаю, как это реализовать.

Этот пост как-то относится к моему предыдущему посту .

Таким образом, схема будет выглядеть так:

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

Не могли бы вы указать мне правильное направление?

Спасибо! BR

Ответы [ 2 ]

1 голос
/ 23 сентября 2012

См. этот пост о том, как поиграться с роутерами

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
1 голос
/ 12 марта 2012

Многопользовательская работа в целом немного сложна, если не крутить django, хотя это типичный запрос в приложениях SaaS.Вот ссылка, описывающая один подход , разработанный в компании, с которой я работал, немного отличался, взломав contrib.sites, но часть базы данных очень похожа.

ВКороче говоря, если вам нужна многопользовательская база данных, вам придется взломать Django ConnectionHandler , чтобы сделать то, что вы хотите.

...