Django自定义User模型后迁移及Google认证报错求助
问题描述
我在settings.py中添加了AUTH_USER_MODEL = 'main.User'(main是存放所有模型的应用),将自定义User模型设为认证用户模型。但后来才知道这个配置应该在初始迁移前设置,现在尝试在后台集成Google认证时,收到auth_user表为空(无id为1的记录)的错误。
我尝试删除迁移文件并将数据库恢复到迁移前状态,却出现错误:
ValueError: The field socialaccount.SocialAccount.user was declared with a lazy reference to 'main.user', but app 'main' isn't installed.
按照一篇文章的建议清空了PostgreSQL数据库、迁移文件及__pycache__后,执行makemigrations时出现错误:
ValueError: The field socialaccount.SocialAccount.user was declared with a lazy reference to 'auth.user', but app 'auth' isn't installed.
执行migrate时又出现:
django.db.utils.ProgrammingError: relation "main_user" does not exist
已尝试搜索解决方案但无果,求解决办法。
settings.py 部分配置
INSTALLED_APPS = [ 'landing', 'main', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.google', ] TEMPLATES = [ { 'DIRS': [ os.path.join(BASE_DIR, 'landing', 'frontend', 'build'), os.path.join(BASE_DIR, 'landing', 'templates'), os.path.join(BASE_DIR, 'main', 'frontend', 'dist'), ], # ... }, ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # ... } } AUTH_USER_MODEL = 'main.User' STATICFILES_DIRS = [ # ... ] AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend' ] SITE_ID = 1 LOGIN_REDIRECT_URL = '/' # Additional configuration settings SOCIALACCOUNT_QUERY_EMAIL = True ACCOUNT_LOGOUT_ON_GET= True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_EMAIL_REQUIRED = True SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', ], 'AUTH_PARAMS': { 'access_type': 'online', } } }
解决方案
1. 彻底清理残留的迁移和缓存
- 删除所有应用下的
migrations文件夹(保留每个文件夹里的__init__.py) - 删除项目根目录及所有应用内的
__pycache__文件夹 - 清空PostgreSQL数据库:
也可以用pgAdmin等可视化工具直接删除重建数据库DROP DATABASE your_db_name; CREATE DATABASE your_db_name;
2. 确认自定义User模型及应用配置
- 检查
main应用的models.py,确保自定义User模型正确继承AbstractUser或AbstractBaseUser,示例:from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): # 自定义字段写在这里 pass - 确认
main/apps.py配置正确:from django.apps import AppConfig class MainConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'main'
3. 重新生成并执行迁移
- 先给
main应用生成初始迁移(确保自定义User模型的迁移优先生成):python manage.py makemigrations main - 执行所有迁移:
python manage.py migrate
4. 创建超级用户
python manage.py createsuperuser
5. 测试Google认证
完成以上步骤后重启项目,重新配置Google OAuth信息并测试认证功能即可。
内容的提问来源于stack exchange,提问作者Tices
相关产品推荐
相关产品推荐

