【问题标题】:Django how to use separate database for default authenticationDjango如何使用单独的数据库进行默认身份验证
【发布时间】:2020-02-06 08:10:01
【问题描述】:

我有一个从非 django 应用程序创建的数据库,并定义了如下所示的数据库连接信息

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': os.environ.get('POSTGRES_HOST'),
        'PORT': os.environ.get('POSTGRES_PORT'),
    }
}

不幸的是,当我迁移 django admin 相关的表时,它们都进入了默认数据库。

我知道可以声明多个数据库并将读写操作分开到不同的数据库;但是,我想做的是将所有默认的 django admin 相关表创建到另一个数据库中。假设我声明了第二个数据库,如下所示,我如何确保 django admin 相关数据迁移到第二个数据库并在我登录 django admin 时从中读取?

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': os.environ.get('POSTGRES_HOST'),
        'PORT': os.environ.get('POSTGRES_PORT'),
    },
    'admin':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('ADMIN_POSTGRES_DB'),
        'USER': os.environ.get('ADMIN_POSTGRES_USER'),
        'PASSWORD': os.environ.get('ADMIN_POSTGRES_PASSWORD'),
        'HOST': os.environ.get('ADMIN_POSTGRES_HOST'),
        'PORT': os.environ.get('ADMIN_POSTGRES_PORT'),
    }
}

【问题讨论】:

  • 我也在为多个数据库而苦苦挣扎。也许您想查看我的question。我自己回答的,我想它也涵盖了你的问题。

标签: django


【解决方案1】:

首先您必须将默认字典保留为空

然后为管理员和非管理员定义数据库

例如这样做

DATABASES = {
    'default':{},
    'nonAdmin': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': os.environ.get('POSTGRES_HOST'),
        'PORT': os.environ.get('POSTGRES_PORT'),
    },
    'admin':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('ADMIN_POSTGRES_DB'),
        'USER': os.environ.get('ADMIN_POSTGRES_USER'),
        'PASSWORD': os.environ.get('ADMIN_POSTGRES_PASSWORD'),
        'HOST': os.environ.get('ADMIN_POSTGRES_HOST'),
        'PORT': os.environ.get('ADMIN_POSTGRES_PORT'),
    }
}

然后你可以使用迁移数据库

./manage.py 迁移 --database=admin

./manage.py migrate --database=nonAdmin

如果您不希望每个应用程序都同步到特定数据库上,您可以定义一个数据库路由器,该路由器实施限制特定模型可用性的策略。

通过使用这种方法 allow_migrate(db, app_label, model_name=None, **hints)

你可以参考这篇文档https://docs.djangoproject.com/en/3.0/topics/db/multi-db/#topics-db-multi-db-routing

【讨论】:

  • 所以在不指定任何额外配置的情况下,django 只会在运行时知道我将管理表迁移到了哪个数据库?
  • 使用数据库路由器,您可以指定在迁移数据库时使用哪个数据库,或者在选择时您可以查看上面提供的链接了解更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2019-05-22
  • 2020-12-22
  • 2012-12-26
  • 2018-04-21
  • 2013-03-11
相关资源
最近更新 更多