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

这篇具有很好参考价值的文章主要介绍了Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

假设您有以下两个模型:

from django.db import models

class 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 AbstractUser


class 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.username

    class 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, Permission


class 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 ,就没有报错了,如下图所示:
Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。,Django,django,数据库,sqlite文章来源地址https://www.toymoban.com/news/detail-600075.html

到了这里,关于Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux usermod命令、groupmod命令使用方法(bad names(不良名称))(GECOS field(GECOS字段))

    usermod 命令用于修改用户账户的属性。它可以用来修改用户的用户名、用户ID、用户组ID、用户家目录、用户登录Shell等属性。例如,要将用户的登录Shell修改为 /bin/bash ,可以使用以下命令: 其中, username 是要修改的用户的用户名。 翻译: 什么是bad names(不良名称)? \\\"bad n

    2024年02月12日
    浏览(53)
  • vue+relation-graph绘制关系图实用组件

    先在终端执行命令 创建一个vue2的项目 然后在编辑器中打开新创建的项目 在终端中执行命令 引入依赖 这样 我们relation-graph就进来了 然后 我们在需要使用的组件中编写代码如下 这里 首先 大家要缕清关系 我们每个节点都带有id 例如N1 N15 然后 我们设置根节点的id是N1 links梳理

    2024年02月13日
    浏览(44)
  • Unified Named Entity Recognition as Word-Word Relation Classification

    原文链接:https://arxiv.org/pdf/2112.10070.pdf AAAI 2022          NER主要包括三种类型: flat 、 overlap 和d iscontinuous 。目前效果最好的模型主要是:span-based和seq2seq,但前者注重于边界的识别,后者可能存在exposure bias。         作者对entity words之间的相邻关系进行建模,将NE

    2024年02月16日
    浏览(34)
  • vue插件——relation-graph——实现关系图功能——技能提升

    在做组织关系图时,经常会遇到关系图的实现要求,就是要将人与人或者组织与组织或者人与组织之间的关系进行一一展示。已知的就是节点和关系。 最近在写后台管理系统时,遇到一个需求,就是要实现关系图: 如下图所示: 在前年写天眼查功能时,我也遇到过这种需求

    2024年02月11日
    浏览(43)
  • 《论文阅读》Unified Named Entity Recognition as Word-Word Relation Classification

    将NER视作是word-word间的 Relation Classification。 这个word-word 间的工作就很像是TPlinker那个工作,那篇工作是使用token间的 link。 推荐指数:★★★☆☆ 值得学习的点: (1)用关系抽取的方法做NER抽取 (2)用空洞卷积解决词间交互问题 (3)CLN(conditional LayerNorma)的使用 统一三

    2023年04月14日
    浏览(46)
  • Vue与relation-graph:高效打造关系图的秘诀

    产品提需求啦,有一个需求就是实现一个功能:展现各个文件之间的调用关系,通过关系图的形式进行展示出来。 之前考虑使用antv x6实现此功能,但是考虑到只是展示的功能,也不需要进行交互,所以放弃使用antv x6,选择了更加简单的relation-graph插件。 先来看一个示例项目

    2024年02月08日
    浏览(49)
  • [实体关系抽取|顶刊论文]OneRel:Relational Triple Extraction: One Step is Enough

    2022.5.11 |IJCAI-2022|华中科技大学|2022年SOTA| 原文链接 过去的步骤: 寻找头尾实体的边界位置(实体识别) 将特定令牌串联成三元组(关系分类) 存在误差累计问题,每个实体边界识别误差会累积到最终的组合三元组中 论文中的方法: 先通过枚举句子中的令牌序列生成

    2024年02月12日
    浏览(53)
  • 获取component组件的name名称

    import sgComponent from \\\"@/vue/components/sgComponent\\\"; sgComponent.name 就是组件的name 在组件自身内部console.log(this.$options.name) 可以获取自己的name 此外,this.$options.还可以获取data()、methods、created()、watch等等信息

    2024年02月13日
    浏览(43)
  • 名称服务器(Name Server)介绍

       名称服务器 (Name Server)是互联网域名系统(DNS)中的一部分,它们负责将用户可读的域名(例如:www.example.com)解析为计算机可识别的IP地址(例如:192.168.1.1)。这使得我们可以使用容易记忆的域名访问网站,而不是需要记住复杂数字的IP地址。   名称服务器通常

    2024年01月24日
    浏览(37)
  • [实体关系抽取|顶刊论文]UniRel:Unified Representation and Interaction for Joint Relational Triple Extraction

    2022.11.16|EMNLP 2022|中国科学技术大学 |原文链接|源码链接 解决实体和关系异构表示问题 解决实体-实体交互和实体-关系交互异构建模问题 通过一个串联的自然语言序列联合编码统一实体和关系的表示,同时使用一个交互映射系统来统一交互 过去(如CasRel、PRGC)都在 关

    2024年02月04日
    浏览(105)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包