You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义用户模型+多数据库环境下Django Admin登录失败求助

Django多数据库+自定义用户模型Admin登录ImproperlyConfigured错误排查

错误信息

ImproperlyConfigured: settings.DATABASES配置不当

项目代码片段

models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

class UserAccountManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('Users must have an email address')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(email, password, **extra_fields)

class UserAccount(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.email

router.py

class AuthRouter:
    route_app_labels = {'auth', 'contenttypes', 'admin', 'sessions'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if (
            obj1._meta.app_label in self.route_app_labels or
            obj2._meta.app_label in self.route_app_labels
        ):
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

settings.py(关键配置)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',
]

AUTH_USER_MODEL = 'accounts.UserAccount'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'main_db',
        'USER': 'db_user',
        'PASSWORD': 'db_pass',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'auth_db': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'auth_db',
        'USER': 'db_user',
        'PASSWORD': 'db_pass',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

DATABASE_ROUTERS = ['myproject.router.AuthRouter']

urls.py

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

排查与修复步骤

  1. 验证数据库路由覆盖范围
    Admin登录依赖sessions、auth、contenttypes、admin这几个系统app的模型,确保router.py的route_app_labels包含所有这些标签。如果遗漏,Django会尝试使用默认数据库查找这些模型的表,若表不存在则触发配置错误。

  2. 确认迁移已在对应数据库执行

    • 系统app(auth、admin、sessions等)的迁移必须在auth_db执行:
      python manage.py migrate --database=auth_db
      
    • 自定义accounts app的迁移要在default数据库执行(如果路由未指定该app到其他库):
      python manage.py migrate accounts --database=default
      
  3. 检查超级用户存储位置
    创建超级用户时需明确指定数据库,确保用户数据存放在路由指向的数据库中:

    python manage.py createsuperuser --database=auth_db
    

    如果超级用户存放在default库,而Admin登录时路由指向auth_db,会因找不到用户间接触发配置错误。

  4. 核对DATABASES配置细节
    检查每个数据库的ENGINE、NAME、USER、PASSWORD等参数是否拼写正确,确认目标PostgreSQL数据库已创建,且指定用户拥有读写权限。

  5. 验证路由的allow_migrate逻辑
    确保allow_migrate方法正确限制系统app仅在auth_db迁移,避免系统表被创建在错误的数据库中。若逻辑错误,登录时会因找不到对应表抛出配置异常。

内容的提问来源于stack exchange,提问作者Henrik Peterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:07:38