模型关系

作者: GHope | 来源:发表于2018-10-17 19:45 被阅读12次

模型关系主要分为一对一,一对多和多对多。在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

相关文章

  • 海量数据--在线大数据处理的理论与实践--淘宝沈询_Whispe

    从需求出发来看关系模型与非关系模型--关系模型与非关系模型概述 1.层次模型2.关系模型3.ORMapping的作...

  • 数据库原理

    关系模型 关系模型 实体关系模型 对象关系模型 半结构化数据模型 XML(扩展标记语言) 数据语言 DML 数据操...

  • 数据库设计(四)关系模型和关系数据库

    关键词 关系模型,关系数据库,关系操作,完整性约束 关系模型 关系模型是目前最为重要的数据模型,关系数据库采用关系...

  • Linux之MariaDB基础详解

    Lamp之MariaDB 数据库结构模型分类 1、层次模型 2、网状模型 3、关系模型 关系模型的组成部分 二维关...

  • 数据库-关系数据库

    关系是一种二维平面表,关系模型由关系数据结构、关系完整性约束和关系操作集合三部分组成。 1.关系数据模型:关系模型...

  • 关系模型

    数据模型三要素数据结构(静态特性):描述数据库的组成对象及对象间的联系常用来命名数据模型:层状模型,网状模型,关系...

  • 关系模型

    (一)视角,换个角度,冰山一角,对和错之间的纠结,思路打不开 生活中习以为常的事情全新定义,换个角度看问题,经常审...

  • 模型关系

    模型关系主要分为一对一,一对多和多对多。在flask官网中只给出了一对多和多对多的解释应用,所以一对一的实现依赖于...

  • 关系模型

    基本概念 在关系型数据库中,关系模型中的概念与数据库层面上的概念的对应关系如下: 关系(relation)指关系型...

  • 关系模型

网友评论

    本文标题:模型关系

    本文链接:https://www.haomeiwen.com/subject/anbbaftx.html