运行migrate_schemas时出现users_user表不存在的Django多租户错误
问题分析与修复方案
错误根源
执行python manage.py migrate_schemas --shared时出现django.db.utils.ProgrammingError: relation "users_user" does not exist,核心原因是:
- 全局配置的
AUTH_USER_MODEL = 'users.User'指向自定义用户模型,但users应用仅被加入TENANT_APPS,未在SHARED_APPS中。 - 迁移共享schema(public)时,
SHARED_APPS里的django.contrib.admin依赖用户模型表,但此时shared schema中不存在users_user表,导致迁移失败。
修复方案
根据业务需求选择以下两种方案之一:
方案一:将用户模型放到共享schema(适合全局管理用户场景)
此方案下所有用户数据存储在shared schema,每个用户关联对应的租户,便于全局管理超级管理员等角色。
- 修改
settings.py,将users应用加入SHARED_APPS:
SHARED_APPS = [ 'django_tenants', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'crispy_forms', 'crispy_bootstrap5', 'django_htmx', 'django_celery_beat', 'core', 'tenants', 'users', # 添加此行 ]
- 重置并重新生成用户应用的迁移文件:
- 删除
users/migrations/目录下所有旧迁移文件(保留__init__.py) - 执行命令生成新迁移:
python manage.py makemigrations users
- 重新执行共享schema迁移:
python manage.py migrate_schemas --shared
方案二:将admin应用移到租户schema(适合租户完全隔离场景)
此方案下每个租户的schema独立包含admin和用户模型,shared schema不包含admin,适合需要严格租户数据隔离的场景。
- 修改
settings.py,将django.contrib.admin从SHARED_APPS移到TENANT_APPS:
SHARED_APPS = [ 'django_tenants', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'crispy_forms', 'crispy_bootstrap5', 'django_htmx', 'django_celery_beat', 'core', 'tenants', # 移除'django.contrib.admin' ] TENANT_APPS = [ 'django.contrib.admin', # 添加此行 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users', 'accreditation', 'documents', 'checklists', 'notifications', 'reports', 'audit', ]
- 执行共享schema迁移:
python manage.py migrate_schemas --shared
- 创建租户后,执行租户schema迁移:
python manage.py migrate_schemas
附加警告处理
对于静态文件目录不存在的警告,直接创建对应目录即可:
mkdir D:\workik_projects\AccrediDoc_V3\static
内容的提问来源于stack exchange,提问作者Dr BRIJESH PATEL
相关产品推荐
相关产品推荐

