Flask-多对多关系

看了第四遍Miguel Grinberg写的《Flask Web》一书,前面部分都非常顺利,但到了关注者这一章,被多对多关系卡住了。在写本篇博客时我脑子里还是一团浆糊,边写边想吧。

在说多对多关系之前,先回顾一下一对多关系

一对多

拿之前的章节来说,有两张表,分别是Role表和User表。
Role表:普通用户,管理员
User表:用户名,邮件,地址,电话。。。

我们知道,一个用户只能有一种角色,但一种角色可以有多个用户。
即:一个角色对应多个用户。

粗略地使用SQLAlchemy构建一对多关系就是

class Role(db.Model):
    ...
    users = db.relationship('User', backref='role')

class User(db.Model):
    ...
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
  • 外键的值就是另一张表的主键值,通过这样一种相同值将2张表联结起来
  • 关系表的设计:保证一类一表,用相同值(外键)联结在一起

上面的代码表示,我们在User表中添加了外键(role_id列),它的值指向roles表的主键(id列),这样,user可以通过role_id的值来获取其角色内容

多对多关系

先来看多对多关系的实际应用:学生选课
一名学生可以选择多门课,
一门课也同时有多名学生选择
学生选课就是一个多对多的关系。你怎么用student表和class表来表示这个多对多的关系?先想想看怎么加这个外键,因为外键才是联结两表的重要部分。

学生表

学号姓名
1
2
3

课程表

课程号课程
101
102
103

如果在学生表里加个class_id(课程号)

学号姓名课程号
1101
2101
3102

你会发现,一名学生只能选择一门课,一门课可以被多个学生选择。
反之,如果你在课程表里加个学号,那也只能表示,一门课只有一名学生。所以只有2张表的话,外键是不好加进去的。

解决方法:添加第3张表,我们称之为“”关联表“”。

关联表学号关联表课程号
1101
1102
2101
3102
2103

这他妈不就是一一对应的表嘛!!(滑稽)
尽管这有点滑稽,但是它却能完美解决我们的问题

  1. 一个学生有多个记录,但一个记录只能属于一个学生。
  2. 一个课程有多个记录,但一个记录也只能有一个课程

这就是关联表的作用,将多对多拆分成两个一对多。

SQLAlchemy实现:
这里写图片描述

几点说明

1.关联表就是一张简单的表,不是模型,所以注意写法
2.多对多关系可以在任意一侧定义关系,这里是在student表里定义
3.secondary参数为关联表名
4.backref会自动处理另一侧的反向引用,所以你看class表那么简洁

现在查询就变的简单了。
要查小明选的所有课:小明.classes.all()
要查所有上语文课的学生:语文.students.all()
如果小明再选一门数学:小明.classes.add(数学)
如果小明退选一门化学:小明.classes.remove(化学)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值