2014-01-21 9 views
1

Так у меня есть проект Django с несколькими базами данных:Django Несколько баз данных Но Auth в однофазном Db

default 
login 
foo 
bar 

Каждое приложение имеет собственную базу данных (например, входа в систему приложение будет хранить все модели в авторизации базы данных и т.д.).

Я хочу хранить все связанные с Django администраторы, такие как разрешения, пользователи, группы в базе данных по умолчанию. Это как мой маршрутизатор выглядит:

class DBRouter(object): 
    default_db_apps = (
     'auth', 
     'admin', 
     'contenttypes', 
     'sessions', 
    ) 

    def db_for_read(self, model, **hints): 
     if model._meta.app_label in self.default_db_apps: 
      return 'default' 
     return model._meta.app_label 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label in self.default_db_apps: 
      return 'default' 
     return model._meta.app_label 

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

    def allow_syncdb(self, db, model): 
     if model._meta.app_label in self.default_db_apps: 
      return db == 'default' 
     return False 

Когда я бегу:

python manage.py syncdb --noinput 

Он создает все авторизовать из связанных таблиц в базе данных по умолчанию, который является правильным. Однако, когда я смотрю на таблицу auth_permissions, в других приложениях отсутствуют разрешения. Например:

defaultdb=# select * from auth_permission; 
id |   name   | content_type_id |  codename  
----+-------------------------+-----------------+-------------------- 
    1 | Can add log entry  |    1 | add_logentry 
    2 | Can change log entry |    1 | change_logentry 
    3 | Can delete log entry |    1 | delete_logentry 
    4 | Can add permission  |    2 | add_permission 
    5 | Can change permission |    2 | change_permission 
    6 | Can delete permission |    2 | delete_permission 
    7 | Can add group   |    3 | add_group 
    8 | Can change group  |    3 | change_group 
    9 | Can delete group  |    3 | delete_group 
10 | Can add user   |    4 | add_user 
11 | Can change user   |    4 | change_user 
12 | Can delete user   |    4 | delete_user 
13 | Can add content type |    5 | add_contenttype 
14 | Can change content type |    5 | change_contenttype 
15 | Can delete content type |    5 | delete_contenttype 
16 | Can add session   |    6 | add_session 
17 | Can change session  |    6 | change_session 
18 | Can delete session  |    6 | delete_session 
(18 rows) 

Я хотел бы разрешение на все модели (даже модели в различных базах данных), чтобы быть сохранены в приложении по умолчанию.

Любое решение для этого?

ответ

1

Дело в том, что в разрешениях используются внешние ключи (общие внешние ключи с ContentTypes, если я хорошо помню), а внешние ключи между двумя базами данных не поддерживаются!

Увидеть этот пост Django - multiple databases and auth.Permission

Вы также можете прочитать the limitation of multiple databases из Джанго документации.

Несколько цитат:

Джанго в настоящее время не предоставляют никакой поддержки внешнего ключа или многие-ко-многим, охватывающих несколько баз данных.

Несколько приложений для участия включают в себя модели, а некоторые приложения зависят от других. Поскольку взаимосвязи между базами данных невозможны, это создает некоторые ограничения на то, как вы можете разделить эти модели между базами данных:
- каждый из типов contenttypes.ContentType, sessions.Session и sites.Site может быть сохранен в любой базе данных с учетом соответствующего маршрутизатора ,
- auth models - User, Group and Permission - связаны между собой и связаны с ContentType, поэтому они должны храниться в той же базе данных, что и ContentType.

Смежные вопросы