一对多和多对一关联

news/2024/11/18 21:30:04/文章来源:https://www.cnblogs.com/yongheng999/p/18292245

比如:作者和文章之间, 部门和员工之间都是一对多的关联关系。反过来就是:多对一的关联关系

 

1、定义外键约束


定义关系的第一步是创建外键。外键是(foreign key)用来在 A 表存储 B 表的主键值以便和 B 表建立
联系的关系字段。
因为外键只能存储单一数据(标量),所以外键总是在 “多” 这一侧定义,多篇文章属于同 一个作
者,所以我们需要为每篇文章添加外键存储作者的主键值以指向 对应的作者。在 Article 模型中,我们
定义一个 author_id 字段作为外键:
注意ForeginKey的参数是<表名>.<键名>,而不是<类名>.<字段名>

 

# 多对一关联的外键
dept_id: Mapped[Optional[int]] = mapped_column(ForeignKey('t_dept.id'))

 

2、定义关联属性和双向关联

我们在 Author 类中定义了集合关系属性 articles ,用来获取某个作者拥有的多篇文章记录。
在某些情况下,你也许希望能在 Article 类中定义 一个类似的 author 关系属性,当被调用时返
回对应的作者记录,而这种两侧都添加关系属性获取对方记录的关系我们称之为 双向关系。双向关系
并不是必须的,但在某些情况下会非常方便。

# 多对一关联的属性, back_populates写对方模型类中的关联属性名字
dept: Mapped[Optional['Dept']] = relationship(back_populates='emp_list')
# 一对多的关联属性
emp_list: Mapped[List['Employee']] = relationship(back_populates='dept',
cascade='save-update')

 

3、级联操作


cascade,默认选项为save-update:
• 一:save-update:默认选项,在添加一条数据的时候,会把其他和次数据关联的数据都添加到数
据库中,这种行为就是save-update属性决定的
• 二:delete:表示当删除某一个模型中的数据的时候,也删除掉使用relationship和此数据关联的
数据

三:delete-orphan:表示当对一个ORM对象解除了父表中的关联对象的时候,自己便会被删除,
如果父表的数据被删除,同样自己也会被删除,这个选项只能用在一对多上,不能用在多对多和多
对一上,并且使用的时候还需要在子模型的relationship中增加参数:single_parent=True
• 四:merge(合并):默认选项,当在使用session.merge合并一个对象的时候,会将使用了
relationship相关联的对象也进行merge操作
• 五:expunge:移除操作的时候,会将相关联的对象也进行移除,这个操作只是从session中移
除,并不会正则从数据库删除
• 六:all:对 save-update、merge、refresh-expire、expunge、delete 这几种的缩写

 

4、树形结构的自关联

 

class Dept(Base):
"""部门的模型类"""
__tablename__ = 't_dept'
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(String(20), unique=True, nullable=False)
address: Mapped[Optional[str]] = mapped_column(String(50))
# 一对多的关联属性
emp_list: Mapped[List['Employee']] = relationship(back_populates='dept',
cascade='save-update')
# 自己和自己外键
pid: Mapped[Optional[int]] = mapped_column(ForeignKey('t_dept.id'))
# 自己和自己一对多的关联的属性
children: Mapped[List['Dept']] = relationship(back_populates='parent')
# 自己和自己多对一的关联的属性 remote_side = [id], 写到多的一端。(非列表)
parent: Mapped[Optional['Dept']] = relationship(back_populates='children',
remote_side=[id])

维护一对多自关联关系的时候(relationship),必须加入:remote_side= [id]

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

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

相关文章

树莓派4B-用串口读取JY901S陀螺仪数据

陀螺仪是一种用来感测与维持方向的装置,基于角动量的理论设计出来的。陀螺仪主要是由一个位于轴心可以旋转的轮子构成,陀螺仪一旦开始旋转,由于轮子的「角动量」,陀螺仪有抗拒方向改变的趋向。陀螺仪多用于导航、定位等系统JY901S是9轴姿态角度传感器,支持串口和 IIC 两种…

Java 中的泛型 集合(List,Set) Map

泛型 集合(List,Set) Map 泛型泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性泛型的具体定义与作用定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<> 来声明类型参数.这些参数在编译时会被具体的…

创建vue2项目执行npm install -g @vue/cli报错 no such file or directory, mkdir \\?

第一步:查看默认全局安装路径。 指令:npm config get prefix 我这里路径 npm config get prefix E:\NVM\nvm\node_global 第二步:不存在这个路劲进行更换 npm config set prefix "D:\Develop\nodejs" nodejs里面有 node_cache node_global node_modules 这些文件 …

NAND Flash基础介绍 一

Chip CI 颗粒厂商提供的是整个一块晶圆,晶圆上已经把芯片划分好了,如下图模组厂商或者颗粒厂商会把晶圆拿去分割,拆分出一个个芯片,每个拆分下来的芯片型号、工艺、空间大小等由颗粒厂家提前定制好了,具体说明可参考https://www.cnblogs.com/studywithallofyou/p/18291633…

各类插件

生成图片html2canvas : 基于页面中存在且可用的DOM结构、样式,构建“截图”,绘制到canvas画布中dom-to-image:将DOM 节点序列化为XML,包装到SVG中,再转为图片。

性能测试:性能测试流程与方法

简介 性能测试流程是指在进行性能测试时所遵循的一系列步骤和阶段,以确保对系统的全面测试和评估。性能测试流程的具体步骤可能会因组织、项目和测试需求而有所不同。 性能****测试流程分析现状:首先需要对应用程序或系统进行详细的分析,了解其当前的性能状况、发现性能瓶颈…

ESP32-S3开发板技术研究第一篇

1. 最小系统板原理图框架,第1路USB转串口,第2路USB直连模组 2. RGB灯是自带主控的,WS2812是一种智能控制LED灯源,集成了控制电路和RGB芯片在一个5050封装组件中。 3. 软件开发,编译环境 3.1 先安装 vs code 3.2 在vscode 的扩展里面搜索 ESP-IDF插件,安装

Flask API 如何接入 i18n 实现国际化多语言

如何在现有的 Flask API 项目中,引入 i18n 实现国际化多语言,同时与前端 Vue3 页面联动。​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。 用户请求 API 的多语言化其实有两种解决方案…

1 python介绍、基本语法、流程控制

一、 Python介绍python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜,Python赶超PHP占据第五, Python崇尚优美、清晰、简单,是一个优…

记录 中**信 ruoyi项目 部署全流程

零 本地环境改为线上环境 包括 1 后端的数据库连接地址 2 后端的文件存储本地地址 3 后端的文件存储ip地址 4 前端baseUrl 一 后端项目打包双击package 二 mstsc 进入服务器 三 备份四 后端jar包替换五 前端文件替换六 检查数据库需不需要备份 七 启动 java -jar ruoyi-admin.j…

hackmyvm-airbind

环境 靶机ip:未知 攻击机kali:ip1:192.168.96.59 ip2:192.168.56.103 主机探测 arp-scan -l发现了56.104这个机子应该就是我们的靶机,接下来先对其进行端口扫描 端口扫描发现开放了80端口,但是22端口状态显示为filtered,不知道开放还是关闭 访问80端口,发现是wallos的管理…

Vue3-slot

描述为了能在当前组件中使用其他组件中的内容,并且可以改变其他组件中的内容结构。使用的技术就叫做“插槽”。在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。举例:子组件<FancyButton/>: <template><button cl…