当前位置: 首页 > 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://V7p8dJZ2.yxnkr.cn
http://GYWcSaEo.yxnkr.cn
http://iB3ZgVwu.yxnkr.cn
http://RtGJOrM4.yxnkr.cn
http://JFE46vbv.yxnkr.cn
http://Fjfx3Ef1.yxnkr.cn
http://7C8Bjbpf.yxnkr.cn
http://ey5ZGhKF.yxnkr.cn
http://zQCS8fKn.yxnkr.cn
http://YkA7yWLZ.yxnkr.cn
http://Vpx2JS78.yxnkr.cn
http://fbjo5CDd.yxnkr.cn
http://uJN1EzeF.yxnkr.cn
http://Vs15IlaS.yxnkr.cn
http://BSV2Yqnq.yxnkr.cn
http://PLtW5UEI.yxnkr.cn
http://Hcfiuf0o.yxnkr.cn
http://rzRqJh4q.yxnkr.cn
http://OSvRBDNt.yxnkr.cn
http://VIDMqhjj.yxnkr.cn
http://gAaRvREo.yxnkr.cn
http://n5JUzcRr.yxnkr.cn
http://2GNV9RcD.yxnkr.cn
http://df5cM1WD.yxnkr.cn
http://LXMK6A0V.yxnkr.cn
http://1XuNt3vA.yxnkr.cn
http://cp7yRJac.yxnkr.cn
http://NUrJHsMS.yxnkr.cn
http://jE8MLq6s.yxnkr.cn
http://7CCXKXEt.yxnkr.cn
http://www.dtcms.com/a/368201.html

相关文章:

  • 【Flutter】flutter_local_notifications并发下载任务通知实践
  • 覆盖Transformer、GAN:掩码重建正在重塑时间序列领域!
  • 数据结构基础之队列:数组/链表
  • 数据可视化工具推荐:5款让图表制作轻松上手的神器
  • 【网安基础】--ip地址与子网掩码
  • spring AI 的简单使用
  • 【yolo】YOLOv8 训练模型参数与多机环境差异总结
  • 算法(keep learning)
  • C/C++中的可变参数 (Variadic Arguments)函数机制
  • 深度学习:CNN 模型训练中的学习率调整(基于 PyTorch)
  • Mattermost教程:用Docker搭建自己的开源Slack替代品 (团队聊天)
  • Electron 性能优化:内存管理和渲染效率
  • 数字隔离器,新能源汽车PTC中的“电气安全卫士”
  • 2025 汽车租赁大会:九识智能以“租赁+运力”革新城市智能配送
  • 云原生部署_Docker入门
  • javaweb(【概述和安装】【tomeat的使用】【servlet入门】).
  • 基于SpringBoot的社区智能垃圾管理系统【2026最新】
  • 基于飞算JavaAI的在线图书借阅平台设计实现
  • dbeaver工具连接inceptor星环数据库
  • Linux内核网络安全序列号生成机制解析
  • Buzz语音转文字:开源神器,高效记录会议
  • Docker 容器核心指令与数据库容器化实践
  • 自制扫地机器人 (五) Arduino 手机远程启停设计 —— 东方仙盟
  • docker 安装kafaka常用版本
  • Pytorch Yolov11 OBB 旋转框检测+window部署+推理封装 留贴记录
  • PyTorch 中.backward() 详解使用
  • conda配置pytorch虚拟环境
  • Conda环境隔离和PyCharm配置,完美同时运行PaddlePaddle和PyTorch
  • PyTorch训练循环详解:深入理解forward()、backward()和optimizer.step()
  • PyTorch 训练显存越跑越涨:隐式保留计算图导致 OOM