SqlAlchemy relationship函数 之 backref参数反向引用的理解

简单来说, 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,外键通常是父表的主键

Last modification:November 25th, 2019 at 09:18 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment