Lanms Blog

模型的一对一/一对多/多对多
Publish: 2019/3/27   

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

1. 一对一关系

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


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 的中间表要我们自己书写, 并且在其中添加关联关系

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


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
通过学生去查询课程的信息
stu = Student.query.get(id)
cous = stu.cou


← 模型的创建 模型的一对多查询和数据迁移 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel