简单来说, relationship函数是sqlalchemy对关系之间提供的一种便利的调用方式, backref参数则对关系提供反向引用的声明。
如下例子:
# 电影
class Movie(db.Model):
__tablename__ = "movie"
id = db.Column(db.Integer, primary_key=True) # 编号
title = db.Column(db.String(255), unique=True) # 标题
url = db.Column(db.String(255), unique=True) # 地址
info = db.Column(db.Text) # 电影简介
logo = db.Column(db.String(255), unique=True) # 封面
star = db.Column(db.SmallInteger) # 星级
playnum = db.Column(db.BigInteger) # 播放量
commentnum = db.Column(db.BigInteger) # 评论量
# (设置外键第一步)
tag_id = db.Column(db.Integer, db.ForeignKey('tag.id')) # 所属标签
area = db.Column(db.String(255)) # 上映地区
release_time = db.Column(db.Date) # 上映时间
length = db.Column(db.String(100)) # 播放时间
addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间
comments = db.relationship("Comment", backref='movie') # 评论外键关系关联
moviecols = db.relationship("Moviecol", backref='movie') # 收藏外键关系关联
def __repr__(self):
return "<Movie %r>" % self.title
# 评论
class Comment(db.Model):
__tablename__ = "comment"
id = db.Column(db.Integer, primary_key=True) # 编号
content = db.Column(db.Text) # 评论内容
# 关联外键第一步,还要去user表和movie表进行第二步
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所属电影
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属用户
addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间
def __repr__(self):
return "<Comment %r>" % self.id
如果在Movie中使用relationship定义comment属性的话,就可以实例化Movie对象的时候调用comment属性,如下所示:
movie = Movie.query.get_or_404(int(id))
comment = movie.comment
注意,这里的到的comment,可以取出comment表中的所有属性字段,如果有外键,甚至外键的所属的表数据也能找到。
而定义的backref参数则对关系提供反向引用的声明。意思就是电影中relationship函数定义了backref,然后实例化Comment后,该对象可以反向找到backref指向的表,具体如下:
comment = Comment.query.get_or_404(int(id))
movie = comment.movie
除了可以拿到movie表所有字段,还能拿到完成度的relationship指向的comments中comment表数据。
例子示例2:
一对多:一个父亲可能有多个孩子
1 class Father(……):
2 id = ……
3 children = db.relationship('Children', backref='father')
4
5 class Children(……):
6 # ……
7 father_id = …… ForeignKey('father.id'))
1 我是爸爸
2 我是身份证号
3 我有一些孩子登记在Children表上。上面的每一个children都可以通过 . father找到我。backref是我给孩子们的名片(上面是身份证号)。
5 我们是孩子们
7 我拿着爸爸的身份证号
当我们需要在父表中添加子表关系时使用 relationship,外键通常是父表的主键
版权属于:Jolly
本文链接:https://totoro.site/index.php/archives/28/
关于转载:原创文章,禁止转载