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