Flask04-模型的一对一,一对多,多对多


1. 一对一关系

  • 主要通过一个 uselist=False 来约束, 因为在一对多中通过 查询得到的是一个列表, 所以, uselist=False禁用列表, 使我们只能查找到一个, 就构成了一对一关系

人和身份证的一对一一关系

  
  
  from flask_sqlalchemy import SQLAlchemy
  
  db = SQLAlchemy()
  
  class Persion(db.Model):
      __tablename__ = 'tb_persion'
      p_id = ... #主键字段
      ...
      ident_id = db,Column(db.Integer, db.ForeignKey('tb_ident.id'))
  
  class Ident(db.Model):
      __tablename__ = 'tb_ident'
      id = # 主键字段
      ...
      persion = db.relationship('User', backref='ident', uselist=False)

2. 一对多关系

班级和学生是一对多关系, 一个班级中可以有多个学生

学生 和 班级 模型

  
  
  from flask_sqlalchemy import SQLAlchemy
  
  db = SQLAlchemy()
  
  class Student(db.Model): # Many
      __tablename__ = 'tb_student'
      s_id = # 主键
      ...
      s_grade = db.Column(db.Interger, db.ForeignKey('tb_grade.g_id'))
      
  class Grade(db.Model):  # one
      __tablename__ = 'tb_grade'
      c_id = # 主键
      ...
      students = db.relationship('Student', backref='stu', lazy=True)

backref 字段主要是用于通过建立的联系, 来进行反向查询, 例如, Student 可以通过 Grade 模型中关联的 'stu', 来进行查询班级

3. 多对多关系

多对多关系主要是要创建中间表, 不同于 Django 的是 Flask 的中间表要我们自己书写, 并且在其中添加关联关系

  • 关键在于 relationship , 这个关联关系可以放在两张表的任意一张表中, 但是不可以放在中间表中

  • relationship 中的 secondary 是中间表

学生表 和 课程表 是 多对多关系, 一个学生可以选择多门课程, 一个课程也可以有多个学生选择

  
  
  from flask_sqlalchemy import SQLAlchemy
  
  db = SQLAlchemy()
  
  class Student(db.Model):
      __tablename__ = 'tb_student'
      s_id = ... # 主键字段
      ...
      
  
  class Course(db.Model):
      __tablename__ = 'tb_course'
      c_id = ...  # 主键字段
      ...
      students = db.relationship('Student', secondary=sc, backref='course')
      
  # 中间表
  sc = db.Table('sc',
      db.Column('s_id', db.Integer, db.ForeignKey('tb_student.s_id'), primary_key=True),
      db.Column('c_id', db.Integer, db.ForeignKey('tb_course.c_id'), primary_key=True)   
  )

4.添加删除联系和查询

添加学生和课程之间的关系

通过页面中传递学生的id和课程的id,分别获取学生的对象和课程的对象,在使用关联关系append去添加学生对象,并且add以后再commit后,就可以在中间表sc中查看到新增的关联关系了。

  
      userid = request.form.get('userid')
      courseid = request.form.get('courseid')
  
      stu = Student.query.get(userid)
      cou = Course.query.get(courseid)
  
      cou.students.append(stu)
      db.session.add(cou)
      db.session.commit()
删除学生和课程之间的关系

通过页面获取传递的学生的id和课程的id,分别获取学生对象和课程对象,在使用关联关系remove去删除学生对象,并commit将事务提交到数据库中

  
  stu = Student.query.get(s_id)
  cou = Course.query.get(c_id)
  
  cou.students.remove(stu)
  db.session.commit()
通过课程查询学生的信息

以下定义在课程course的模型中,所以通过课程查询学生的信息,语法为课程的对象.studengs。如果知道学生的信息反过来找课程的信息,则使用backref的反向关联去查询,语语法为学生的对象.cou(反向)

students = db.relationship('Student',secondary=sc,backref='cou')

  
  cou = Course.query.get(2)
  stus = cou.students
通过学生去查询课程的信息

猜你喜欢

转载自blog.csdn.net/zhang_ming_lu/article/details/80788038