自定义用户模型+多数据库环境下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), ]
排查与修复步骤
验证数据库路由覆盖范围
Admin登录依赖sessions、auth、contenttypes、admin这几个系统app的模型,确保router.py的route_app_labels包含所有这些标签。如果遗漏,Django会尝试使用默认数据库查找这些模型的表,若表不存在则触发配置错误。确认迁移已在对应数据库执行
- 系统app(auth、admin、sessions等)的迁移必须在
auth_db执行:python manage.py migrate --database=auth_db - 自定义
accountsapp的迁移要在default数据库执行(如果路由未指定该app到其他库):python manage.py migrate accounts --database=default
- 系统app(auth、admin、sessions等)的迁移必须在
检查超级用户存储位置
创建超级用户时需明确指定数据库,确保用户数据存放在路由指向的数据库中:python manage.py createsuperuser --database=auth_db如果超级用户存放在
default库,而Admin登录时路由指向auth_db,会因找不到用户间接触发配置错误。核对DATABASES配置细节
检查每个数据库的ENGINE、NAME、USER、PASSWORD等参数是否拼写正确,确认目标PostgreSQL数据库已创建,且指定用户拥有读写权限。验证路由的allow_migrate逻辑
确保allow_migrate方法正确限制系统app仅在auth_db迁移,避免系统表被创建在错误的数据库中。若逻辑错误,登录时会因找不到对应表抛出配置异常。
内容的提问来源于stack exchange,提问作者Henrik Peterson
相关产品推荐
相关产品推荐

