Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。

当在模型中为关系字段添加了related_name参数后,您可以使用该参数指定的名称来引用反向关系。下面是一个简单的例子来说明如何引用反向关系。

假设您有以下两个模型:

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')

在上面的例子中,Book模型有一个外键字段author,它关联到Author模型。通过添加related_name='books'参数,您为Book模型指定了反向关系名称为books

现在,您可以使用该反向关系名称在Author模型的实例中访问与其相关的Book对象集合。例如:

author = Author.objects.get(pk=1)
books = author.books.all()

在上面的代码中,我们从数据库中获取了Author模型的一个实例,并通过books反向关系名称访问了与该作者相关的所有书籍对象。

通过使用related_name参数,您可以根据需要指定反向关系的名称,以便在模型之间进行导航和访问相关对象。

下面是一个“使用反向关系名称(related_name)解决由“多对多”中间关系表的反向关系名引起的冲突问题。

关于什么是中间关系表,为什么要有中间关系表,以及由中间关系表的反向关系名引起的冲突问题的详细解释,请参考我的另一篇表博文:
通过一个实际例子说明Django中的数据库操作方法法ForeignKey()-外键的用法【数据表“一对多”关系】,并详解“中间关系表”、反向关系(related_name)、反向关系名冲突的概念

E:\Python_project\P_001\myshop-test\myshop_background_2\users\models.py 中的代码如下:

from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUserclass MyUser(AbstractUser):SEX = ((0, '男'),(1, '女'),)LEVEL = ((1, '寂寞卡会员'),(2, '钻石卡会员'),(3, '金卡会员'),(4, '银卡会员'),)STATUS = ((0, '正常'),(1, '异常'),)truename = models.CharField('真实姓名', blank=True, max_length=50)mobile = models.CharField('手机号码', max_length=11, default="")sex = models.IntegerField(default=0, choices=SEX)birthday = models.DateField(blank=True, null=True)user_img = models.ImageField("头像", upload_to="user_img", default="")level = models.IntegerField(default=4, choices=LEVEL)status = models.IntegerField(default=0, choices=STATUS)create_time = models.DateTimeField(default=datetime.now, verbose_name='创建时间')update_time = models.DateTimeField(default=datetime.now, verbose_name="更新时间")def __str__(self):return self.usernameclass Meta(AbstractUser.Meta):permissions = (['check_myuser', '审核用户信息'],)

执行数据库迁移命令 manage.py makemigrations 时报错如下:

SystemCheckError: System check identified some issues:ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'auth.User.groups' clashes with reverse accessor for 'users.MyUser.groups'.HINT: Add or change a related_name argument to the definition for 'auth.User.groups' or 'users.MyUser.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'auth.User.user_permissions' clashes with reverse accessor for 'users.MyUser.user_permissions'.HINT: Add or change a related_name argument to the definition for 'auth.User.user_permissions' or 'users.MyUser.user_permissions'.
users.MyUser.groups: (fields.E304) Reverse accessor for 'users.MyUser.groups' clashes with reverse accessor for 'auth.User.groups'.HINT: Add or change a related_name argument to the definition for 'users.MyUser.groups' or 'auth.User.groups'.
users.MyUser.user_permissions: (fields.E304) Reverse accessor for 'users.MyUser.user_permissions' clashes with reverse accessor for 'auth.User.user_permissions'.HINT: Add or change a related_name argument to the definition for 'users.MyUser.user_permissions' or 'auth.User.user_permissions'.

错误提示指出了关于groupsuser_permissions字段的冲突。

具体来说,有两个冲突:
①是auth.User的groups字段与users.MyUser中的groups中产生了冲突;
②是auth.User.的user_permissions字段与users.MyUser中的user_permissions产生了冲突。

提问:auth.User是什么时候引入的?
答案在下面这段代码里:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# 'basic','users',
]

注意下面代码中的语句:

    'django.contrib.auth',

提问:明明自己的模块中没有定义groupsuser_permissions字段啊?
答:定义了的,因为自己定义的MyUser模型继承自AbstractUser,而AbstractUser又继续了系统自带的User模型的这些字段。

解决方法:

解决方法一:
不在setting.py中去注册应用 ‘django.contrib.auth’,但是如果要使用Django自带的后台系统,不建议这么做,原因如下:
在Django中,默认情况下,django.contrib.auth应用是用于身份验证和用户管理的关键应用程序,它提供了Django自带的后台管理系统的用户认证和权限管理功能。如果您想要使用Django自带的后台管理系统,通常是需要包括django.contrib.auth应用的。

settings.py中的INSTALLED_APPS设置中包括django.contrib.auth应用可以确保后台管理系统正常工作,并具备用户认证和权限管理的功能。这样,您可以使用内置的用户模型、用户组、权限等功能。

如果您不想使用Django自带的后台管理系统,或者您已经有了自定义的用户管理系统,可以考虑从INSTALLED_APPS中移除django.contrib.auth应用。这样可以减少不必要的代码和数据库表,并使得您的项目更加轻量化。

但是请注意,如果您移除了django.contrib.auth应用,您将失去许多与用户认证和权限相关的功能,包括但不限于以下内容:

  • 用户认证和登录功能
  • 用户注册和密码重置功能
  • 用户权限和权限管理功能
  • 用户组管理功能
  • 后台管理系统的用户认证和权限管理功能

所以,在决定是否移除django.contrib.auth应用之前,请确保您已经有了替代的用户认证和权限管理方案,并且考虑到相关功能的实现和维护成本。

解决方法二:

重命名自定义模型中的groupsuser_permissions字段**:如果希望在自定义的模型中保留groupsuser_permissions字段,但避免与内置的auth.User模型发生冲突您可以为这两个字段添加related_name参数并指定不同的名称。例如:

from django.db import models
from django.contrib.auth.models import AbstractUser, Group, Permissionclass MyUser(AbstractUser):# ...groups = models.ManyToManyField(Group,verbose_name='groups',blank=True,help_text='The groups this user belongs to.',related_name='user_groups'  # 设置不同的 related_name)user_permissions = models.ManyToManyField(Permission,verbose_name='user permissions',blank=True,help_text='Specific permissions for this user.',related_name='user_permissions'  # 设置不同的 related_name)# ...

通过为自定义模型中的groupsuser_permissions字段添加related_name参数,并将其设置为与内置auth.User模型的字段不同的名称,可以避免冲突。

请注意,修改模型后,您需要再次运行makemigrationsmigrate命令来应用更改:

python manage.py makemigrations
python manage.py migrate

修改完成后再执行命令 makemigrations ,就没有报错了,如下图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解

文章目录 0.前言1. 原理详解1.1. 哨兵机制的组建1.1. 哨兵是如何知道从库的信息 1.2. 主库下线的判定1.3. 哨兵集群选举1.4. 故障的转移 2. 总结3. Redis从入门到精通系列文章4. Redis哨兵模式面试题4. 1. 什么是Redis的哨兵模式?4. 2. 哨兵模式的优点是什么&#x…

CCF真题练习:202209-1如此编码

题目背景 某次测验后,顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字,小 P 同学不禁陷入了沉思…… 题目描述 已知某次测验包含 n 道单项选择题,其中第 i 题(1≤i≤n)有 个选项,…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用,这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的,在上一篇的时候提到测试了一下,从PC1去访问PC4的时候,只从E0/0/2发送给了E0/0/3这是,因为两个接…

gogs的自定义配置

在 GOGS 下载并安装后,在程序目录下建立一个custom/conf/app.ini的配置文件,内容如下: APP_NAME Gogs # APP名字 RUN_USER git # 启动用户,设置后只能以此账号启动gogs RUN_MODE prod[database] DB_TYPE mysql HOST 1…

PHP特性之CTF中常见的PHP绕过

目录 一、关于md5()和sha1()的常见绕过 1、使用数组绕过 2、 使用特殊字符串绕过 二、strcmp绕过 三、switch绕过 四、intval绕过 一、关于md5()和sha1()的常见绕过 知识介绍: 1、对于php强比较和弱比较:md5(),sha1()函数无法处理数组…

使用3DS Max 创建未来派螺栓枪模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤 1 创建一个框并将其转换为可编辑多边形(右键单击>转换为:>转换为可编辑多边形),然后使用连接添加一系列边循环,如下图所示。 步骤 2 …

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

⚡【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 | 介绍雷神之锤 III 源码中的平方根倒数速算法 | 浮点数类型的表达方式

🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…

文件IO_文件截断_ftruncate,truncate(附Linux-5.15.10内核源码分析)

目录 1.为什么需要文件截断? 2.truncate函数介绍 2.1 truncate函数 2.2 truncate函数内核源码分析 2.3 truncate函数使用示例 3.ftruncate函数介绍 3.1 ftruncate函数 3.2 ftruncate函数内核源码分析 3.3 ftruncate函数使用示例 3.4 ftruncate和文件偏移量…

进程间通信之共享内存

共享内存 1.共享内存的概念2.共享内存函数2.1 shmget函数2.2 shmat函数2.3 shmdt函数2.4 shmctl函数 3. 共享内存的使用 1.进程间通信的分类: (1)管道:1、匿名管道pipe;2、命名管道mkfifo (2)System V IPC&…

【算法基础:数据结构】2.2 字典树/前缀树 Trie

文章目录 知识点cpp结构体模板 模板例题835. Trie字符串统计❤️❤️❤️❤️❤️(重要!模板!)143. 最大异或对😭😭😭😭😭(Trie树的应用) 相关题目…

C# MVC 多图片上传预览

一.效果图: 开发框架:MVC,Layui 列表主界面这里就不展示了,可以去看看这篇文章:Layui项目实战,这里讲的是“上传Banner”界面功能: 其中包括,多文件上传,预览&#xff0c…

vue进阶-消息的订阅与发布

📖vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件,父组件调用自定义事件接收子组件返回参数。 📖vue进阶-vue-route 介绍了路由组件传参,两种方式&…

【conan】本地编译三方库,上传conan服务器

1.6 conan 远程已经编译好的库 conan中文博客: 三方库资源: github conan-io 本地查询 conan search Existing package recipes:b2/4.9.6 boost/1.71.0nolovr/stable bzip2/1.0.8 ceres-solver/2.0.0nolovr/stable eigen/3.3.7nolovr/stable eigen_c…

【软件测试】selenium中元素的定位

1.元素的定位 不管用那种方式,必须保证页面上该属性的唯一性 1.CSS 定位 CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML 和XML 文档的表现。 CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略CSS的获取可…

C++基础算法前缀和和差分篇

📟作者主页:慢热的陕西人 🌴专栏链接:C算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了前缀和和差分算法 文章目录 Ⅳ. 前缀和 和 差分Ⅵ .Ⅰ前缀和…

echarts_柱状图+漏斗图

目录 柱状图(bar)需求[1] 复制案例[2] 修改类目轴方向[3] 修改数据渲染方向[4] 修改坐标轴文本样式 漏斗图(funnel)漏斗图的形状 柱状图(bar) 需求 如上图,做一个横向柱状图,后端返回的数据是从小向大排列的数据,希望能够按照顺序进行展示。…

【Docker】详解docker安装及使用

详解docker安装及使用 1. 安装docker1.1 查看docker版本信息 2. Docker镜像操作3. Docker容器操作4.知识点总结4.1 docker镜像操作4.2 docker容器操作4.3 docker run启动过程 参见docker基础知识点详解 1. 安装docker 目前Docker只能支持64位系统。 ###关闭和禁止防火墙开机自…

pytorch+CRNN实现

最近接触了一个仪表盘识别的项目,简单调研以后发现可以用CRNN来做。但是手边缺少仪表盘数据集,就先用ICDAR2013试了一下。 结果遇到了一系列坑。为了不使读者和自己在以后的日子继续遭罪。我把正确的代码发到下面了。 1)超参数请不要调整&am…

Android oom_adj 详细解读

源码基于:Android R 0. 前言 在博文《oom_adj 内存水位算法剖析》一文中详细的分析了lmkd 中针对 oom_adj 内存水位的计算、使用方法,在博文《oom_adj 更新原理(1)》、《oom_adj 更新原理(2)》中对Android 系统中 oom_adj 的更新原理进行了详细的剖析。…