python一对多的通信管理_python-复盘-flask-数据库一对一/一对多/多对多关系

本文介绍了在Flask中如何处理数据库的多对多关系,以学生和学院为例,展示了如何定义和操作多对多关系,包括添加、删除和查询。通过使用SQLAlchemy的`db.relationship()`和`secondary`参数,可以轻松管理学生和学院之间的关系。同时,文章还提供了实际的代码示例,展示了如何在用户转学院场景下更新多对多关系。
摘要由CSDN通过智能技术生成

Flask 数据库多对多关系

实现学生与学院之间的多对多关系

5c0fe8b4c95c

这个例子中的关联表是 registrations,表中的每一行都表示一个学生注册的一个课程。查询多对多关系要分成两步。 若想知道某位学生选择了哪些课程,你要先从学生和注册之间的一对多关系开始, 获取这位学生在 registrations 表中的所有记录,然后再按照多到一的方向遍历课程和注册之间的一对多关系, 找到这位学生在 registrations 表中各记录所对应的课程。 同样,若想找到选择了某门课程的所有学生,你要先从课程表中开始,获取其在 registrations 表中的记录,再获取这些记录联接的学生。通过遍历两个关系来获取查询结果的做法听起来有难度, 不过像前例这种简单关系,SQLAlchemy 就可以完成大部分操作。

registrations = db.Table('registrations',

db.Column('student_id', db.Integer, db.ForeignKey('students.id')),

db.Column('class_id', db.Integer, db.ForeignKey('classes.id'))

)

class Student(db.Model):

id = db.Column(db.Integer, primary_key=True)

name = db.Column(db.String)

classes = db.relationship('Class',secondary=registrations,

backref=db.backref('students', lazy='dynamic'),

lazy='dynamic')

class Class(db.Model):

id = db.Column(db.Integer, primary_key = True)

name = db.Column(db.String)

多对多关系仍使用定义一对多关系的 db.relationship() 方法进行定义,但在多对多关系中,必须把 secondary 参数设为关联表。多对多关系可以在任何一个类中定义, backref 参数会处理好关系的另一侧。关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表。

这样处理多对多关系特别简单。假设学生是 s,课程是 c,学生注册课程的代码为:

>>> s.classes.append(c)

>>> db.session.add(s)

列出学生 s 注册的课程以及注册了课程 c 的学生也很简单:

>>> s.classes.all()

>>> c.students.all()

Class 模型中的 students 关系由参数 db.backref() 定义。注意,这个关系中还指定了 lazy= 'dynamic' 参数,所以关系两侧返回的查询都可接受额外的过滤器。

如果后来学生 s 决定不选课程 c 了,那么可使用下面的代码更新数据库:

>>> s.classes.remove(c)

下面来看一个实际的例子:因为在设计中学生会转学院,所以,学生与学院是多对多的关系

1. 定义模型

class User(UserMixin, db.Model):

__tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

email = db.Column(db.String(100), unique=True, index=True)

.............省略其他字段

departments=db.relationship('Department', secondary=user_department, backref=db.backref

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值