看啥推荐读物
专栏名称: GHope
比起鲜衣怒马的牵黄擎苍啊,我还是更喜欢白衣策马的仗剑天涯。
目录
相关文章推荐
今天看啥  ›  专栏  ›  GHope

模型关系

GHope  · 简书  ·  · 2018-10-17 19:45

模型关系主要分为一对一,一对多和多对多。在flask官网中只给出了一对多和多对多的解释应用,所以一对一的实现依赖于一对多的限制。即在一对多的关系中,对多的哪一方加入唯一属性。

一对多模型定义

from flask_sqlalchemy import SQLAlchemy

# 获取对象
db = SQLAlchemy()


class Students(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(10), unique=False, nullable=False)
    s_age = db.Column(db.Integer, default=18)
    s_c = db.Column(db.Integer, db.ForeignKey('cla.id'), nullable=True)

    def save(self):
        db.session.add(self)
        db.session.commit()


class Class(db.Model):
    __tablename__ = 'cla'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    c_name = db.Column(db.String(30), unique=True, nullable=False)
    students = db.relationship('Students', backref='cla')

多对多模型补充定义

s_c = db.Table('s_c',
               db.Column('s_id', db.Integer, db.ForeignKey('students.id'), primary_key=True),
               db.Column('c_id', db.Integer, db.ForeignKey('course.id'), primary_key=True))


class Course(db.Model):
    __tablename__ = 'course'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    c_name = db.Column(db.String(30), unique=True, nullable=False)
    students = db.relationship('Students', secondary=s_c, backref='cou')

创建一对多关系

@blue.route('rel_stu_cla')
def rel_stu_cla():
    stus_ids = [1, 3, 4]
    for id in stus_ids:
        stu = Students.query.get(id)
        # 在flask中stu.s_c获取的值为int型
        # 在fDjango中stu.s_c获取的是对象,stu_c_id获取到int类型
        stu.s_g = 1
        stu.save()
    return '关联学生和班级'

创建多对多关系

@blue.route('/add_stu_cou/')
def add_stu_cou():
    stu = Students.query.get(8)
    # 学生对象查找课程信息,stu.cou
    cou1 = Course.query.get(1)
    cou2 = Course.query.get(2)
    cou3 = Course.query.get(3)
    # 绑定学生和课程的关联关系
    stu.cou.append(cou1)
    stu.cou.append(cou2)
    stu.cou.append(cou3)
    stu.save()
    return '南山选课成功'

通过一对多的关系查询

@blue.route('/sel_stu_by_cla/')
def sel_stu_by_cla():
    cla = Class.query.filter(Class.c_name == '天干').first()
    stus = cla.students
    return '通过班级查找学生信息'


@blue.route('/sel_cla_by_stu/')
def sel_cla_by_stu():
    stu = Students.query.get(5)
    # 获取班级,学生对象.backref
    cla = stu.cla
    return '通过学生查找班级信息'

删除学生和课程之间的关系

通过页面获取传递的学生的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



原文地址:访问原文地址
快照地址: 访问文章快照