【问题标题】:Django Multiple Databases But Auth In Single DbDjango 多个数据库但在单个数据库中进行身份验证
【发布时间】:2014-01-21 13:54:15
【问题描述】:

所以我有一个包含几个数据库的 Django 项目:

default
login
foo
bar

每个应用程序都有自己的数据库(例如登录应用程序会将所有模型存储在登录数据库等)。

我想在默认数据库中存储所有与 Django Admin 相关的模型,例如权限、用户、组。这是我的路由器的外观:

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)

我希望将所有模型(甚至不同数据库中的模型)的权限存储在默认应用中。

有什么解决办法吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    问题是权限使用外键(如果我没记错的话,是通用外键和 ContentTypes),不支持两个数据库之间的外键!

    看到这个帖子Django - multiple databases and auth.Permission

    您还可以阅读 Django 文档中的the limitation of multiple databases

    引用几句:

    Django 目前不支持外键或跨多个数据库的多对多关系。

    一些 contrib 应用程序包含模型,并且一些应用程序依赖于其他应用程序。由于跨数据库关系是不可能的,这对如何跨数据库拆分这些模型产生了一些限制:
    - contenttypes.ContentType、sessions.Session 和 sites.Site 中的每一个都可以存储在任何数据库中,只要有合适的路由器。
    - 身份验证模型——用户、组和权限——链接在一起并链接到 ContentType,因此它们必须与 ContentType 存储在同一个数据库中。

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2016-09-10
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多