一对多
按创建单张表的方法,创建学院Deptment表
class Deptment(db.Model): __tablename__ = 'deptments' dno = db.Column(db.Integer, primary_key=True) dname = Sname = db.Column(db.String(10),index=True)
学院和学生是一对多的关系。Flask-SQLAlchemy
是通过db.relationship()
解决一对多的关系。在Dept中添加属性,代码如下:
class Deptment(db.Model): ... students = db.relationship('Student', backref='dept') class Student(db.Model): ... dept_no = db.Column(db.Integer, db.ForeignKey('deptments.dno'))
表的外键由db.ForeignKey
指定,传入的参数是表的字段。db.relations
它声明的属性不作为表字段,第一个参数是关联类的名字,backref
是一个反向身份的代理,相当于在Student类中添加了dept的属性。例如,有Deptment实例dept和Student实例stu。dept.students.count()
将会返回学院学生人数;stu.dept.first()
将会返回学生的学院信息的Deptment类实例。一般来讲db.relationship()
会放在一
这一边。
多对多
多对多的关系可以分解成一对多关系,例如:学生选课,学生与课程之间的关系:
sc = db.Table('sc', # 将其他两张表的关联起来 db.Column('sno', db.String(10), db.ForeignKey('students.sno')) db.Column('cno',db.String(10), db.ForeignKey('courses.cno')) ) Class Course(db.Model): __tablename__ = 'courses' cno = db.Column(db.String(10), primary_key=True) cname = db.Column(db.String(10), index=True) students = db.relationship('Student', secondary=sc, backref=db.backref('course',lazy='dynamic'), lazy='dynamic' )
sc
表由db.Table
声明,我们不需要关心这张表,因为这张表将会由SQLAlchemy
接管,它唯一的作用是作为students表和courses表关联表,所以必须在db.relationship()
中指出sencondary
关联表参数。lazy
是指查询时的惰性求值的方式,这里有详细的参数说明,而db.backref
是声明反向身份代理,其中的lazy
参数是指明反向查询的惰性求值方式,SQLAlchemy
鼓励这种方式声明多对多的关系。
但是如果关联表中有自定义的字段,如sc表中添加成绩字段则需要更改表声明方式,将sc
更改为继承db.Model
的对象并设置sc:courses = 1:n
和sc:student = 1:n
的关系。
转载自:这里