当前位置: 首页 > news >正文

踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案

一、问题现象分析

咱们在用Django开发时,有时候需要扩展用户模型,就会去继承AbstractUser。但这么做的时候,要是没处理好groups和user_permissions这两个多对多字段的反向查询名称,就会遇到这样的报错:
在这里插入图片描述

主要就是这种错误:

ERRORS:
auth.User.groups: (fields.E304) Reverse accessor clashes...
HINT: Add or change a related_name argument...

说白了,问题出在哪呢?就是Django自带的auth.User模型和咱们自己写的users.User模型,都有同名的多对多字段,结果导致反向查询名称(也就是related_name)打架了。

二、解决方案

1. 显式声明冲突字段
咱们得在自定义用户模型里重新定义一下groups和user_permissions字段,给它们起个独特的名字(也就是设置related_name参数):

# users/models.py
from django.contrib.auth.models import AbstractUser, Group, Permissionclass User(AbstractUser):# 这些是咱们新增的字段,保持不变就行mobile = models.CharField(...)avatar = models.ImageField(...)# 关键修复的地方:重新定义多对多字段groups = models.ManyToManyField(Group,verbose_name='用户组',blank=True,related_name="custom_user_groups",  # 给它起个独特的名字related_query_name="user",)user_permissions = models.ManyToManyField(Permission,verbose_name='用户权限',blank=True,related_name="custom_user_permissions",  # 这个也想起个独特的名字related_query_name="user",)

2. 配置验证
别忘了在settings.py里告诉Django咱们用的是自定义模型:

AUTH_USER_MODEL = 'users.User'  # 这里得对应你的app名和模型名

这一步非常关键,因为它告诉Django整个框架应该使用你的自定义用户模型,而不是默认的auth.User模型,确保认证系统、权限管理和其他依赖用户模型的功能都能正常工作。

3. 执行数据库迁移

最后,执行这两条命令让改动生效:

python manage.py makemigrations
python manage.py migrate

三、原理解读

1. 冲突机制
Django的权限系统是靠groups和user_permissions这两个字段来实现多对多关联的。当咱们自定义的模型继承AbstractUser时,要是没重新定义这两个字段,它们的related_name就会和Django内置的auth.User模型的默认值(通常是user_set)撞车,导致命名冲突。

2. related_name作用
这个参数其实就是给反向查询起个别名。比如说,通过user.groups可以查到用户属于哪些组,反过来,通过Group.custom_user_groups也能查到这个组里有哪些用户。这个别名必须在整个项目里是唯一的,不然就会打架。

3. 字段重写必要性
Django比较"耿直",它不会自动为继承的字段生成新的related_name,所以咱们必须手动重新声明这两个字段,并给它们指定一个独特的related_name参数。

http://www.xdnf.cn/news/1464445.html

相关文章:

  • 【Flask】测试平台中,记一次在vue2中集成编辑器组件tinymce
  • XR数字融合工作站打造智能制造专业学习新范式
  • windows通过xrdp远程连接Ubuntu黑屏问题解决
  • FDTD_3 d mie_仿真
  • 计算机毕设选题:基于Python数据挖掘的高考志愿推荐系统
  • AI+消费,阿里的新故事很性感
  • 新后端漏洞(上)- Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)
  • sub3G、sub6G和LB、MB、HB、MHB、LMHB、UHB之间的区别和联系
  • STM32——WDG看门狗
  • Typer 命令行工具使用示例
  • SQL Server全链路安全防护
  • 【Python】QT(PySide2、PyQt5):点击不同按钮显示不同页面
  • 中天互联:AI 重塑制造,解锁智能生产新效能​
  • [网鼎杯 2020 青龙组]AreUSerialz
  • Excel数据导出小记二: [大数据示例]
  • JP4-7-MyLesson后台前端(一)
  • yolov8部署在一台无显卡的电脑上,实时性强方案
  • 【分享】基于百度脑图,并使用Vue二次开发的用例脑图编辑器组件
  • 探讨Xsens在人形机器人研发中的四个核心应用
  • 产线相机问题分析思路
  • 基于单片机的六足机器人控制系统设计
  • HTML文本格式化标签
  • 嵌入式解谜日志—多路I/O复用
  • AI日报 - 2025年09月05日
  • 专题:2025电力行业5G工厂及绿色转型、市场机制研究报告|附100+份报告PDF、数据仪表盘汇总下载
  • Ubuntu22.04-ROS2下navgation2编译到运行
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 基于muduo库的图床云共享存储项目(五)
  • webshell及冰蝎双击无法打开?
  • 如何将视频从 iPhone 转移到 Mac