Django的mysql数据库问题:同一个模型(同一张表)中的不同记录也是可以相互关联的【使用“自引用关系”】

01-在Django的mysql数据库中,同一模型中的不同记录是不是也是可以相互关联?

是的,确实可以在Django的模型中使用外键来建立同一模型中不同记录之间的关联关系。这样的关联关系被称为自引用关系(self-referential relationship)或者自关联关系。通过在模型中定义外键字段,你可以使模型的实例与同一模型中的其他实例产生关联。

在Django中,这通常通过在模型的外键字段中引用模型本身来实现。如下面的例子所示,你可以在模型中添加一个外键字段,该字段引用同一模型中的其他记录,以建立记录之间的关联关系。

from django.db import modelsclass Movie(models.Model):title = models.CharField(max_length=100)episode_number = models.PositiveIntegerField()related_movie = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name='related_movies')

在这个例子中,related_movie 是指向同一模型的外键。通过设置 'self' 作为外键的目标模型,你可以在模型中建立自引用关系。关键参数 related_name 允许你指定通过反向关系访问相关记录时使用的名称。

这样,你可以通过外键字段在同一模型中不同记录之间建立关联,以满足业务需求。

02-一对多的实例

的影片信息表模型中,如果你希望某些影片之间相互关联,可以添加一个外键字段来表示这种关系。例如,假设你的模型中有一个字段表示集数:

from django.db import modelsclass Movie(models.Model):title = models.CharField(max_length=100)episode_number = models.PositiveIntegerField()  # 假设这个字段表示集数related_movie = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name='related_movies')

在这个例子中,related_movie 是一个指向同一模型的外键。通过设置'self'作为外键的目标模型,你可以创建模型与自身的关联关系。on_delete=models.SET_NULL表示如果关联的影片被删除,将相关字段设置为NULL。

这样,你就可以在某个影片的related_movie字段中引用其他影片的记录,从而建立影片之间的关联关系。例如:

movie1 = Movie.objects.create(title='Movie 1', episode_number=1)
movie2 = Movie.objects.create(title='Movie 2', episode_number=2, related_movie=movie1)# 现在 movie2.related_movie 指向 movie1,表示这两个影片之间存在关联关系

如果是希望对已有的记录进行关联系操作,可以像下面这样做:
假设你已经有了一部电影记录 movie1,现在你想让另一部电影记录 movie2movie1 关联:

# 假设已经有一部电影记录
movie1 = Movie.objects.get(title='Movie 1')# 创建另一部电影记录,并将其与 movie1 关联
movie2 = Movie.objects.create(title='Movie 2', episode_number=2, related_movie=movie1)# movie2.related_movie 现在指向 movie1,表示这两个电影之间存在关联关系

在这个例子中,我们首先通过 Movie.objects.get() 获取了已经存在的 movie1 记录,然后在创建新的电影记录 movie2 时,将其与 movie1 关联。

这样,你就能够在已经存在的记录之间建立关联关系。确保在调用 save() 保存新创建的记录以及关联关系时,数据库中的数据得到更新。

03-多对多的实例

在上面的例子中,使用的是ForeignKey,它表示一对一或多对一关系,即一条记录关联到另一条记录。如果你希望一个记录与多个记录建立关联,可以使用ManyToManyField

下面是一个例子,展示如何使用ManyToManyField建立同一模型中一条记录与多条记录的关联关系:

from django.db import modelsclass Movie(models.Model):title = models.CharField(max_length=100)episode_number = models.PositiveIntegerField()related_movies = models.ManyToManyField('self', blank=True, related_name='related_movies')

在这个例子中,related_movies 是一个ManyToManyField,它允许一条记录关联到多个记录。通过设置 'self' 作为目标模型,你可以在同一模型中建立多对多的自引用关系。

使用这样的配置,一条记录可以与多个其他记录建立关联,反之亦然。你可以通过 related_movies 字段添加或获取关联的记录。

movie1 = Movie.objects.create(title='Movie 1', episode_number=1)
movie2 = Movie.objects.create(title='Movie 2', episode_number=2)
movie3 = Movie.objects.create(title='Movie 3', episode_number=3)# 建立关联关系
movie1.related_movies.add(movie2, movie3)# 获取关联的记录
related_movies = movie1.related_movies.all()

在这个例子中,movie1movie2movie3 建立了多对多的关联关系。这使得同一模型中的不同记录能够相互关联,并且一条记录可以与多条记录建立关联。

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

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

相关文章

【Leetcode】269.火星词典(Hard)

一、题目 1、题目描述 现有一种使用英语字母的火星语言,这门语言的字母顺序与英语顺序不同。 给你一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序…

Spark SQL函数定义

目录 窗口函数 SQL函数分类 Spark原生自定义UDF函数 Pandas的UDF函数 Apache Arrow框架基本介绍 基于Arrow完成Pandas DataFrame和Spark DataFrame互转 基于Pandas完成UDF函数 自定义UDF函数 自定义UDAF函数 窗口函数 分析函数 over(partition by xxx order by xxx [as…

嵌入式开发--STM32G4系列片上FLASH的读写

这个玩意吧,说起来很简单,就是几行代码的事,但楞是折腾了我大半天时间才搞定。原因后面说,先看代码吧: 读操作 读操作很简单,以32位方式读取的时候是这样的: data *(__IO uint32_t *)(0x080…

Python GUI库大汇总

所有程序都是基于命令行的,这些程序可能只有一些“专业”的计算机人士才会使用。例如前面编写的五子棋等程序,恐怕只有程序员自己才愿意玩这么“糟糕”的游戏,很少有最终用户愿意对着黑乎乎的命令行界面敲命令。 相反,如果为程序…

如何禁用WordPress站点的管理员电子邮件验证或修改检查频率?

今天boke112百科登录某个WordPress站点时,又出现“管理员邮件确认”的提示,要求确认此站点的管理员电子邮箱地址是否仍然正确。具体如下图所示: 如果点击“稍后提醒我”,那么管理员邮件验证页面就会在3天后重新显示。 说实话&…

[C++] opencv - Mat::convertTo函数介绍和使用场景

Mat::convertTo()函数 Converts an array to another data type with optional scaling. 该函数主要用于数据类型的相互转换。 The method converts source pixel values to the target data type. saturate_cast<> is applied at the end to avoid possible overf…

Pytest应用PO设计模式

Pytest应用PO设计模式 本篇内容主要涉及在软件测试中实现PO设计模式的应用 包含PO思想、PO原则、PO使用方法&#xff0c;最后会写一个实际模板供大家参考。 一、PO思想 ​ PO(PageObject)&#xff0c;在UI页面测试时&#xff0c;通常会存在大量的页面元素和各种点击操作&#…

坚持刷题 | 二叉树的层序遍历

坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷&#xff1a;二叉树的层序遍历 题目 102二叉树的层序遍历 考察点 数据结构基础&#xff1a; 能够正确地使用二叉树数据结构&#xff0c;并了解二叉树的基本性质。编程基础&#xff1a; 能够熟练使用Java编程语言&a…

【NewSQL】-- 分布式数据库 TiDB 和 CockroachDB

一、基本描述 1、TiDB 国产骄傲。从2015年开始&#xff0c;至今已8年&#xff0c;当前最新版本是7.5.x。TiDB 开源分布式 NewSQL 关系型数据库 是新一代开源分布式 NewSQL 数据库&#xff0c;模型受 Google Spanner / F1 论文的启发&#xff0c;实现了自动的水平伸缩&#xff…

win/ubuntu/mac 卸载 安装 docker 命令

1 卸载 参见 Docker 官网: mac /Applications/Docker.app/Contents/MacOS/uninstall卸载Docker Desktop后&#xff0c;可能会留下一些可以删除的剩余文件&#xff1a;rm -rf ~/Library/Group\ Containers/group.com.docker rm -rf ~/Library/Containers/com.docker.docker r…

网络编程【1】

【 1 】什么是网络编程 网络编程是指通过计算机网络进行数据交换和通信的编程过程。它涉及到使用网络协议和通信接口&#xff0c;使不同计算机之间能够进行数据传输和通信。 总结&#xff1a; 网络编程的研究前提就是基于互联网 网络编程就是基于互联网写代码 【 2 】为什么…

Qt编程之仿gnome-terminal终端样式 +颜色文字显示

Qt仿linux 终端样式 颜色文字 1.说再多废话不如直接show code2.实现效果 本文采用QTextBrowser作为文本显示窗口&#xff0c;进行文本的显示。本文实例实现的效果并没有终端的输入效果&#xff0c;这里只是提供一些仿终端样式思路。 1.说再多废话不如直接show code 1.ui文件…

0间隔24h采集线报+源码的资源网

一款网站程序零间隔24h采集线报源码的资源网&#xff0c;更新下载类目的采集 及 导入&#xff0c;这款网站程序&#xff1a;jizhiCMS 高仿新版某刀资源网模板进行自动采集。 安装方法&#xff1a; 将根目录文件上传服务器 将根目录文件的sql.sql导入mysql数据库 环境需要支…

【刷题】 leetcode 2 .两数相加

两数相加 两数相加1 思路一 &#xff08;暴毙版&#xff09;2 思路二 &#xff08;本质出发&#xff09; 谢谢阅读Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 两数相加 我们来看…

【Spring Boot 3】【Redis】分布式锁

【Spring Boot 3】【Redis】分布式锁 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经…

逆向使用webpack打包的网站

webpack webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loader&#xff08;加载器&#xff09;和 plugins &#xff08;插件&#xff09;对资源进行处理&#xff0c;打包成符…

Stack详解(Java)

Stack Java 中的 Stack 是一种基于后进先出&#xff08;LIFO&#xff09;原则的数据结构。Stack 类实现了一个标准的堆栈&#xff0c;它继承自 Vector 类&#xff0c;并提供了一些额外的方法来支持堆栈的操作。 下面是一些 Java Stack 类的详细解释&#xff1a; 构造方法&…

【Nginx】使用自生成证书配置nginx代理https

使用Nginx代理HTTPS请求并使用自签名证书&#xff0c;可以按照以下步骤进行配置&#xff1a; 生成自签名证书&#xff1a; 打开终端或命令提示符&#xff0c;并导航到Nginx配置文件所在的目录。运行以下命令生成自签名证书和私钥&#xff1a; openssl req -x509 -nodes -days 3…

PyTorch 稀疏函数解析:embedding 、one_hot详解

目录 PyTorch子模块Sparse functions详解 embedding 参数 输出形状 示例 带有 padding_idx 的示例 embedding_bag 参数 输出形状 示例 使用 padding_idx 的示例 one_hot 参数 返回 示例 总结 PyTorch子模块Sparse functions详解 embedding torch.nn.function…