Django继承AbstractUser创建用户模型迁移遇E304错误求助
解决Django自定义用户模型迁移E304反向访问器冲突问题
核心原因
当继承AbstractUser创建自定义用户模型时,Django内置的auth.User模型与你的CustomUser模型都会包含groups和user_permissions字段,这两个字段的默认反向访问器名称重复,导致迁移时出现冲突。
解决步骤
1. 配置项目使用自定义用户模型
首先在项目settings.py中声明自定义用户模型,这是使用自定义用户的必要前提,避免Django默认加载auth.User:
# settings.py AUTH_USER_MODEL = 'accounts.CustomUser'
2. 修改CustomUser模型,设置唯一反向关联名
在CustomUser模型中显式重写groups和user_permissions字段,为它们设置唯一的related_name参数,消除命名冲突:
# accounts/models.py from django.contrib.auth.models import AbstractUser, Group, Permission from django.db import models class CustomUser(AbstractUser): # 此处添加你的自定义字段 # 重写groups和user_permissions字段,配置唯一反向关联名 groups = models.ManyToManyField( Group, verbose_name='用户组', blank=True, related_name='customuser_groups', related_query_name='customuser', ) user_permissions = models.ManyToManyField( Permission, verbose_name='用户权限', blank=True, related_name='customuser_permissions', related_query_name='customuser', )
3. 重新执行迁移操作
如果是项目初期无重要数据,可先清理accounts应用下migrations文件夹内除__init__.py外的所有文件,再执行迁移命令:
python manage.py makemigrations python manage.py migrate
注意事项
- 若项目已有生产数据,请勿直接删除迁移文件,需先备份数据,再逐步调整迁移脚本。
- 项目中所有引用用户模型的地方,需使用
get_user_model()或直接导入CustomUser,避免使用auth.User。
内容的提问来源于stack exchange,提问作者Shivam Nirmal
相关产品推荐
相关产品推荐

