Flask-多对多关系

flask-SQLAlchemy 多对多关系 from flask import Flask, redirect, url_for, render_template from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) article_t 阅读详情

看了第四遍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(课程号)

学号姓名课程号
1甲101
2乙101
3丙102

你会发现,一名学生只能选择一门课,一门课可以被多个学生选择。
反之,如果你在课程表里加个学号,那也只能表示,一门课只有一名学生。所以只有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(化学)

Flask-SQLAlchemy多对多关系,增删改查 SQLAlchemy总结SQLAlchemy创建映射关系创建数据库操作对象用户类英雄类用户_英雄中间表查询增加删除更新 SQLAlchemy SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 使用类和对象的方式操作数据库,更加简便相比SQL语句。 ORM 就是 Object Relational Mapper 的简写,就是关系对象映射器的意思。 创建映射关系 以王者荣耀为例,需要构建用户,英雄之间的关系。一个用户可以拥有多个英雄,一个英雄也可以被多个用户拥有。那么就需要三个表: 阅读详情

相关推荐

Flask-SQLAlchemy多对多关系及对中间表的操作

多对多关系是指两个实体之间存在多对多的关联关系,例如学生和课程之间的关系。本文将介绍如何在Flask-SQLAlchemy中处理多对多关系,并对中间表进行操作。本文介绍了在Flask-SQLAlchemy中处理多对多关系及对中间表进行操作的方法。通过定义模型和使用中间表,我们可以轻松地管理多对多关系,并进行关联关系的添加、删除和查询。在多对多关系中,我们经常需要对中间表进行操作,例如添加、删除关联关系等。函数和中间表,我们可以轻松地管理多对多关系,并进行关联关系的添加、删除和查询。属性中删除指定的课程。

RfqrScheme的博客 340

什么是数据库中的多对多关系?

当我说角色时,我的意思是作者,合著者,编辑,校对员,翻译,插画家等。例如,一本书的作者也可以是另一本书的插画家,第三本书的翻译,第四本书的校对员。同时,公司可以从许多供应商处订购相同的产品,例如来自不同律师事务所的服务,来自不同制造商的轮胎等。在这三个示例中,我试图向您展示逻辑数据库模型中的多对多关系。在此示例中,您的任务是创建一个数据库,该数据库将帮助公司存储有关其供应商的信息。如果任务是创建一个数据库来记录来自供应商的订单,那么最好稍微扩展一下表格,就像我在下面所做的那样:​​​​​​​。

allway2的博客 1万+

深入浅出Flask(50):flask_sqlalchemy的创建多对多的关系表

在数据库的设计里,也会经常遇到多对多的关系,比如一个学生可以选择多门课程,一门课程又可以被多个学生选择。在数据库里设计这种多对多的关系,往往需要引入第三张表来表示这种关系。 在SQLAlchemy里创建这种辅助表时,尽量采用原始的db.Table表,而不是db.Model。因为这张中间表一般不存在有意义的字段,也就没有相关的操作,其它操作都是由其它模型来完成的。 在这里使用一个网页与标签的关系来演法,一个网页有多个标签,而一个标签也可以被多个网页引用。所以它们是多对多的关系,按照上面的设计原则就引入第三

大坡3D软件开发 776

一对一,一对多,多对多三种关系简单理解

一对一,一对多,多对多 这三种关系该怎么理解。

weixin_44793582的博客 4239

TI理想二极管在冗余电源中应用实例

深入探讨理想二极管如何提升冗余电源系统的效率与可靠性,通过实际应用案例展示其在电流隔离和自动切换中的优势,帮助工程师优化电源架构设计。

weixin_30653091的博客 992

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 937

MySQL数据库表关系详解(一对多、一对一、多对多)

MySQL数据库表关系详解(一对多、一对一、多对多)

Mr_WoLong 1万+

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 337

多对多(many-to-many)

要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。 举例1:学生-课程 学生信息表:一行代表一个学生的信息(学号、姓名、手机号码、班级、系别...) 课程信息表:一行代表一个课程的信息(课程编号、授课老师、简介...) 选课信息表:一个学生可以选多门课,一门课可以被多个学生选择 学号 课程编号 1 1001 2 1001 1 1002.

Leon_Jinhai_Sun的博客 5638

Unity Shader学习笔记/Urp/水墨风效果

Unity Shader学习

qq_63133691的博客 2118

转录因子详细介绍(motif)

转录因子详细介绍(motif) TF: transcription factor转录因子TFBS: transcription factor binding site转录因子结合位点TFBS是序列内的location,TF特异结合在这里,这个site有这种特点 1 和一些参考相关的一个位置(开始,结束,strand),这些reference可以是染色体开始,geneTSS。也可以是一段sequence 2 A SITE可以是实验证实的(已知的),也可以是一些算法(预测的) 3 例子,下面这个图是酵母

wangprince2017 3万+

多对多关系的理解

文章目录定义:理解:本质: 定义: 多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关 理解: 产品和订单是多对多:单个产品可能出现在多个订单中。单个订单可能包含多个产品。 用户和角色是多对多:单个用户可以拥有多个角色。单个角色可能出现在多个用户中。 学生和班级是一对一:一个学生只能属...

远行的博客 5790

量化投资之工具篇一:Backtrader从入门到精通(1)-手把手教你零基础实现一个策略案例

Backtrader是重要的量化框架,本文记录学习该框架的笔记,内容主要基于Backtrader的网站指导文档。虽然该框架目前用于量化投资领域,但是可以作为数据处理的基本架构,进行改造后用于各种数据的处理,尤其适用于对原始数据处理完成后应用一定的策略进行预测以及可视化处理。 1、简介 Backtrader的特点,就是两点: 1、易于使用; 2、参见第1条。 那么如何使用Backtrader呢?比把大象装进冰箱复杂点,一共4步: 创建一个Cerebro引擎: 加入一个Strategy...

仓鼠王的博客 5万+

Flask 数据库多对多关系

数据库使用关系建立记录之间的联系。其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起。实现这种关系时,要在“多”这一侧加入一个外键,指向“一”这一侧联接的记录。大部分的其他关系类型都可以从一对多类型中衍生。 多对一关系从“多”这一侧看,就是一对多关系。 一对一关系类型是简化版的一对多关系, 限制“多”这一侧最多只能有一个记录。唯一不能从一对多关系中简单演化出来的类型是多对多

ying847782627的博客 1万+

软件项目成本控制实战:从COCOMO模型到挣值分析的5个关键步骤

本文详细介绍了软件项目成本控制的5个关键步骤,从COCOMO模型估算到挣值分析预警,帮助中小型团队精准管理预算。通过简化COCOMO II的有机模式、动态建立成本基准、轻量化挣值分析等方法,项目经理可以有效应对预算超支和进度延误问题,提升项目成功率。

weixin_30733003的博客 227

《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述

《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述

phmatthaus的专栏 1985

Flask 数据库高级多对多关系

之前介绍了多对多关系:http://blog.youkuaiyun.com/ying847782627/article/details/51333090         在之前介绍的多对多关系中,关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表。多对多关系可以分解成原表和关联表之间的两个一对多关系。这个表里面存储了原表的两个主键作为自己的联合主键。 存在的问题:因为在这种关联表里操

ying847782627的博客 4410

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Flask 多对多关系

1.项目结构 对表的基本操作可见链接 2. venv为虚拟环境(可自行百度) 3.多对多关系 多对多关系需要一个中间表关联 设置关联 tags = db.relationship(‘tag’,secondary=article_tag,backref=db.backref(‘articles’)) 需要一个关键字参数 secondary = 中间表 来关联 访问和添加可以通过以下方式进行操作 以下通过文章,作者,文章_标记 三个表示例操作 from flask import Flask from fl

jzj_c_love的博客 572

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Flask 数据库多对多自引用关系

上篇介绍的多对多关系是两个模型是之间的多对多关系,关联表联接的是两个明确的实体,还有些情况下只有一个模型,与自己之间存在多对多关系。比如用户之间的关注。表示用户关注其他用户时,只有用户一个实体,没有 第二个实体。如果关系中的两侧都在同一个表中, 这种关系称为自引用关系。        在关注中, 关系的左侧是用户实体,可以称为“关注者”;关系的右侧也是用户实体,但这些是“被关注者”。从概 念

ying847782627的博客 4816

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【python-flask学习笔记】3.3 SQLAlchemy-多对多关系

数据表多对多关系 多对多关系 多对多关系,需要通过一个中间表进行关联 中间表,使用db.table的方式创建,不能通过class方式实现 设置关联:tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles')),需要用一个关键字参数secondary='中间表名称'来进行关联。 多对多关...

Aboil的博客 473

Flask-sqlalchemy多对多关系

from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./Article2.db' db = SQLAlchemy(app)article_tag = db.Table('articl

Co_zy的博客 4369

flask 多对多关系

from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) #中间表 article_tag = db.Table('article_tag', db.Column('article_id',db.Integer,

nongcunqq的博客 112

Flask框架——模型关系(多对多)

上篇文章学习了,这篇文章我们学习Flask框架——模型关系(多对多关系)。我们拿学生和课程为例子,一个学生可以选多门课程,一门课程可以被多名学生选,所以它们是多对多关系,我们假设数据库中学生表与课程表如下图所示如何使这两张表建立联系呢,是在课程表中多加一个字段来表示哪个学生选了这门课吗?假如是在课程表中多加一个字段,每门课只能被一个学生选,那么该怎么办好呢?想要两张表建立联系,多加一个字段不行的话,那么我们多建一张表不就好了吗?如下图所示。......

霖hero 789

Flask-表的多对多关系

多对多的关系,一般都是拆分成两张一对多的表。

Python粘合剂 230

Flask数据库_表关系之多对多

Flask数据库_表关系之多对多

qq_55961861的博客 693

flask_sqlalchemy 多对多 关系 对中间表的操作

文章目录注意多对多关系表创建(同时添加中间表page_tag)删除(只删除中间表page_tag中的数据)或者这样删除(只删除中间表page_tag中的数据)添加(只添加中间表page_tag中的数据) 注意 多对多关系中,使用relationship关联两张表,需要先建立一张关系表,关系表存储的是其他两张表的主键,同样在操作时也可以使用remove/append方法来删除、添加数据,在多对多关系中,使用append/remove方法,操作的仍然是外键(第三张表,即关系表\中间表)。 多对多关系表 page

weixin_44493841的博客 1413
上一篇: Flask-login
下一篇: Flask-关注者(自引用关系)
PythonKidDz
博客等级 码龄10年 7粉丝 30原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值