You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django基于AbstractUser实现多用户类型迁移时出现反向访问器冲突报错

Django自定义AbstractUser迁移冲突报错解决方案

报错原因

你遇到的是Django自定义用户模型的常见冲突问题:
继承AbstractUser后如果没有在项目配置中指定自定义用户模型为全局默认用户,Django会同时加载内置的auth.User和你自定义的CustomUser两个模型,二者都内置了groups和user_permissions多对多字段,字段的反向访问器名称完全一致,导致冲突触发E304错误。

推荐解决方案(99%场景适用)

自定义AbstractUser的核心目的就是替换Django默认的用户体系,按以下步骤操作即可解决:

  1. 打开项目settings.py配置文件,添加如下配置(注意Accounts是你存放CustomUser的应用名,要和实际应用名一致):
AUTH_USER_MODEL = "Accounts.CustomUser"
  1. 清理旧的无效迁移文件:
  • 进入Accounts应用的migrations目录,删除除__init__.py外的所有文件
  • 开发环境下直接删除项目根目录的db.sqlite3数据库文件(生产环境可执行数据库表清理操作,删除之前迁移生成的auth相关表和django_migrations表中对应记录)
  1. 重新执行迁移命令:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:06:08