首页 > 其他分享 >一对多和多对一关联

一对多和多对一关联

时间:2024-07-09 16:42:11浏览次数:10  
标签:relationship 外键 关联 dept Mapped 一对 id

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

 

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]

标签:relationship,外键,关联,dept,Mapped,一对,id
From: https://www.cnblogs.com/yongheng999/p/18292245

相关文章

  • 一对一关联
    一对一关系实际上是通过建立双向关系的一对多关系的基础上转化而来。比如:一个用户对应一张身份证,一张身份证属于一个用户。 classIdCard(Base):"""省份证的模型类,它和员工之间是一对一的关联关系"""__tablename__='t_id_card'id:Mapped[int]=mapped_column(primary......
  • 一道关联对称点新定义题的详解
    原题:注:该题为2024北京中考考前数学精编卷最后一题,拿到的文档中给出该题的答案如下:其中第(2)问的答案是错误的.而且第(2)问题面的语句表述不通顺,修改如下: ......
  • 关联(Association) && 聚合(Aggregation) && 组合(Composition)
    组合概述在现实生活中,复杂的对象通常是由小的,简单的组成,从简单对象构建复杂对象的过程称为对象组合例如汽车是用金属框架,发动机,轮胎,变速器和其他大量零件制造而成的个人电脑由CPU,主板,内存等组成即便是你也是由较小部分组成:头,身体,腿,手从广义上讲,两个对象存在关系构成了......
  • 记一次.NET引用性能分析 - 客户说关联权限后查询不出数据
    背景:有客户说操作员关联权限后,某个页面查询不出数据,不关联权限就可以现象:1、用带权限的账号登进去后,查询不出数据,F12发现报错,"Anerroroccurredwhileexecutingthecommanddefinition.Seetheinnerexceptionfordetails."         2、浏览器......
  • centos7下载关联centos镜像文件
    1.CentOS在官网上直接下载网址:https://www.centos.org/download/我选择在这里下载https://mirrors.aliyun.com/centos/7/isos/x86_64/ 感觉还是慢直接网盘下载了 centos7.9:链接: https://pan.baidu.com/s/13BAfdn1-T5YkxLJ1IpwQyw提取码: bqyg2. 3. 4, 5. ......
  • vue项目子组件使用 dialog 弹框,如何实现父子组件弹框展示状态关联?
    vue项目,子组件使用el-dialog组件,想要实现在父组件可以控制子组件dialog的展示和隐藏,子组件自己可以控制dialog展示和隐藏,该如何实现?1.子组件(DialogComponent.vue)子组件接受一个来自父组件的prop,用来控制dialog的显示状态,并且当子组件内部需要改变dialog状态时,通过......
  • elementui el-tree 勾选/取消勾选:子级关联,父级不关联
    :check-strictly="true"父子不关联,在方法里处理子级关联逻辑setChecked方法需要定义node-key="id"<el-treeref="tree":data="treeData":props="defaultProps"default-expand-allhighlight-current:expand......
  • C++ 关联容器使用 map, unordered_map, set, unordered_set, multiset, unordered_mul
    关联容器是否有序是否关联值是否可重复访问时间set是否否对数map是是否对数multiset是否是对数multimap是是是对数unordered_map否是否常数unordered_set否否否常数unordered_multiset否否是常数unordered_multimap否是是常数#include<map>#include<set>#includ......
  • 关联规则分析:Apriori算法及其应用
    关联规则分析基础在数据挖掘领域,关联规则分析是一种发现变量之间有趣关系的技术。这种关系通常被描述为“如果...那么...”的模式,例如,“如果一个顾客购买了面包,那么他们也很可能会购买黄油”。Apriori算法是最著名的关联规则挖掘算法之一,广泛应用于市场篮子分析。本事务库与项集......
  • 一对一聊天源码,你是否了解ERedis的扩容机制?
    一对一聊天源码,你是否了解ERedis的扩容机制?Redis的扩容时机Redis会在如下两种情况触发扩容。1、如果没有fork子进程在执行RDB或者AOF的持久化,一旦满足ht[0].used>=ht[0].size,此时触发扩容;2、如果有fork子进程在执行RDB或者AOF的持久化时,则需要满足ht[0].used>5*ht......