关系映射
一对多
- 在"多"表中增加外键关联,引用自"一"表中主键
- 在"一"表实现关联属性以及反向引用
# 在"多"实体中增加外键
外键列名 = db.Column(db.Integer,db.ForeignKey('主表.主键'))
# 在"一"实体中增加反向引用关系
属性名 = db.relationship('多的实体类名',关系选项)
属性名 = db.relationship('关联的实体类',backref='属性名',lazy='dynamic')
# backref : 在关系的另一个模型中添加反向引用
# lazy : 指定如何加载相关记录
# select : 首次访问时加载
# immediate : 源对象加载后立马加载关联数据
# subquery : 立即加载,但使用子查询
# noload : 永不加载
# dynamic : 不加载记录,但提供加载记录的查询
# uselist : 如果设置为False,则不使用列表,使用标量
# secondary : 指定多对多关系中关联表的名字
一对一
- A表中的一条记录只能与B表中的一条记录关联
- B表中的一条记录只能与A表中的一条记录关联
在数据库中的体现
- 在任何一个表(实体)中实现外键关联
- 在另一个表(实体)中实现关联属性以及反向引用
class Wife(db.Model):
... ...
teacher_id = db.Column(db.Integer,db.ForeignKey('teacher.id'))
class Teacher(db.Model):
... ...
wife = db.relationship('Wife',backref='teacher',lazy='dynamic',uselist=False)
多对多
- A表中的一条数据可以与B表中的任意多条数据关联
- B表中的一条数据可以与A表中的任意多条数据关联
实现
使用第三张表来关联(并不需要实体类)
- 创建第三张表
student_course = db.Table(
'student_course' # 在数据库中的表名
db.Column('id',db.Integer,primary_key=True) # 该表的主键
db.Column('student_id',db.Integer,db.ForeignKey('student.id')),
db.Column('course_id',db.Integer,db.ForeignKey('course.id'))
)
- 在任何一个实体中实现关联属性以及反向引用
class Student(db.Model):
courses = db.relationship(
'Course',
secondary='student_course',
lazy='dynamic',
backref=db.backref('students',lazy='dynamic')
)
网友评论