Django基于AbstractUser实现多用户类型迁移时出现反向访问器冲突报错
Django自定义AbstractUser迁移冲突报错解决方案
报错原因
你遇到的是Django自定义用户模型的常见冲突问题:
继承AbstractUser后如果没有在项目配置中指定自定义用户模型为全局默认用户,Django会同时加载内置的auth.User和你自定义的CustomUser两个模型,二者都内置了groups和user_permissions多对多字段,字段的反向访问器名称完全一致,导致冲突触发E304错误。
推荐解决方案(99%场景适用)
自定义AbstractUser的核心目的就是替换Django默认的用户体系,按以下步骤操作即可解决:
- 打开项目
settings.py配置文件,添加如下配置(注意Accounts是你存放CustomUser的应用名,要和实际应用名一致):
AUTH_USER_MODEL = "Accounts.CustomUser"
- 清理旧的无效迁移文件:
- 进入
Accounts应用的migrations目录,删除除__init__.py外的所有文件 - 开发环境下直接删除项目根目录的
db.sqlite3数据库文件(生产环境可执行数据库表清理操作,删除之前迁移生成的auth相关表和django_migrations表中对应记录)
- 重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
特殊场景解决方案(不替换默认用户模型)
如果你确实需要保留Django默认的auth.User体系,仅用CustomUser做额外的用户类,可通过给冲突字段指定related_name解决,修改后的models.py代码如下:
from django.db import models from django.contrib.auth.models import AbstractUser, Group, Permission class CustomUser(AbstractUser): is_customer = models.BooleanField(default = False) is_seller = models.BooleanField(default = False) name = models.CharField(max_length = 60) # 手动指定反向关联名避免冲突 groups = models.ManyToManyField( Group, related_name="customuser_groups", blank=True, help_text="该用户所属的用户组,用户将继承所属用户组的所有权限", related_query_name="customuser", ) user_permissions = models.ManyToManyField( Permission, related_name="customuser_permissions", blank=True, help_text="该用户的专属权限", related_query_name="customuser", )
修改后直接执行迁移命令即可。
内容的提问来源于stack exchange,提问作者Dhiman
相关产品推荐
相关产品推荐

