概述
- 一对多
- 多对多
一对多
首先创建表格,在上篇博文 ‘flask - 表格’ 的
学生表模型(Student)字段后面:加上
# 创建外键 关联到班级标的主键, 实现一对多关系,班级表中也要有对应操作 s_g = db.Column(db.Integer, db.Foreignkey('grade.g_id'), nullabel=True)
班级表 (Grade) 后面加上:
# 定义班级标的一对多关系,不是字段, Student为学生表模型, backref反向查找 students =db.relationship('Student',backref='stu111', lazy=True)
当表格创建成功,数据加成功时可以利用一对多关系实现表格之间快速的查询
# 一对多反向 通过学生 查询学生所在的班级 stu = Student.query.get(id) grade = stu.stu111 # 正向查询 grade = Grade.query.get(id) student = grade.students
多对多
创建中间表(外键管理表)
# 实现多对多关系 定义中间表 用来管理外键 # 实现学生表与课程表的多对多关系 # sc-变量; 'sc'-存放外键表格的名称; 's_id'-字段的名称(外键); 'student.s_id'- 外键所关联表格的主键的名称 sc = db.Table('sc', db.Column('s_id', db.Integer, db.Foreignkey('student.s_id'), primary_key=True), db.Column('c_id', db.Integer, db.Foreignkey('course.c_id'), primary_key=True) )
上篇博文 ‘flask - 创建表格’ 的 Course 模型的字段后面加上:
# 多对多 关联的学生表格的模型 中间表的名称 反向查找 students = db.relationship('Student', secondary=sc, backref='cou' )
当表格创建成功,添加学生和课程之后,关联学生和课程,添加外键关系,会自动存放到外键管理表格中,由于是多对多,所以关联都是相互的,不管谁关联谁,在表格中两个外键是一对
-创建多对多关系
@stu.route('/selectcoursebystu/', methods=['GET', 'POST']) def select_course_by_stu(): if request.method == 'GET': stus = Student.query.all() cous = Course.query.all() return render_template('stu_cou.html', stus=stus, cous=cous) else: # 向外键管理表中 添加外键关联关系 因为是多对多你关联我,我也关联你 s_id = request.form.get('student') c_id = request.form.get('course') # 关联学生和课程 方式1:一个学生与一门课程相关联 原生SQL语句 sql = 'insert into sc(s_id, c_id) value(%s, %s)' %(s_id, c_id) db.session.execute(sql) db.session.commit() 方式2:一个学生与一门课程关联 stu = Student.query.get(s_id) cou = Course.query.get(c_id) # 课程对象 课程表中定义的关系 学生对象 cou.students.append(stu) db.session.add(cou) db.session.commit() 方式3:一个学生与三门课程相关联 s_id = request.form.get('student') c_ids = request.form.getlist('course') stu = Student.query.get(s_id) for c in c_ids: cou = Course.query.get(c) cou.students.append(stu) db.session.add(cou) db.session.commit() 方式4:多个学生 多门课程相关联 s_ids = request.form.getlist('student') c_ids = request.form.getlist('course') for s_id in s_ids: # 该语法等于 Student.query.get(s_id) 但是这里我使用时 报错说session已经提交过参数了, 不能再提交,虽然运行成功, 但是表格中没有数据 用下面的语法得到了解决 stu = db.session.query(Student).get(s_id) for c_id in c_ids: cou = db.session.query(Course).get(c_id) cou.student.append(stu) db.session.add(cou) db.session.commit() return '插入成功'
删除多对多外键关联关系 删除外键管理表中的记录
@stu.route('/deletecoursebyid/<int:s_id>/<int:c_id>/') def delete_course_by_id(s_id, c_id): stu = Student.query.get(s_id) cou = Course.queery.get(c_id) cou.students.remove(stu) db.session.commit() return redirect(url_for('stu.all_stu'))
多对多外键关联建立过之后 可以互相查找了 通过学生查找该学生所选课程
@stu.route('/selectcoursebystu/') def select_course(id): stu = Student.query.get(id) cou是课程表中定义的关系 反向查找 cous = stu.cou return render_template('stucourse.html', course=course, stu=stu)