flask - 表格之间的关联

概述

  1. 一对多
  2. 多对多

一对多

首先创建表格,在上篇博文 ‘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)

猜你喜欢

转载自blog.csdn.net/hello_syt_2018/article/details/80372140