从Flask中学习自相关多-多的关系表

这篇博客介绍了如何在Flask中处理自相关多对多的关系表,特别是用户之间的关注和粉丝关系。作者详细解析了如何创建链接表(relationship)以及使用primaryjoin、secondaryjoin、backref和dynamic等概念来定义和操作这种关系。同时,文章还讨论了如何查询被关注者的帖子,通过join和filter结合order_by进行排序,帮助读者深入理解这些复杂概念。
摘要由CSDN通过智能技术生成

最近在学一篇大神写的有关于Flask的博客

其中有一项要建立“关注“和“粉丝”的关系表,首先这种关系肯定是多到多的关系,其次这种关系是同类的多到到关系,自我理解就是可以互粉,不像老师-学生关系,老师不能是学生的学生,学生不可能是老师的老师(字面意思嗷)

那么这种自相关的关系表,首先和多-多关系表一样,需要有另外一张表做链接(原文中是relationship)。首先,一步一步分解原文中的函数中relationship的解释

app/models.py: Many-to-many followers relationship

class User(UserMixin, db.Model):
    # ...
    followed = db.relationship(
        'User', secondary=followers,
        primaryjoin=(followers.c.follower_id == id),
        secondaryjoin=(followers.c.followed_id == id),
        backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')

在User这张表中,followed关系中的‘User’代表的是需要和其他哪些表相关联,因为是自相关,所以就和User这一种表相关联。

secondary这个参数就是我现在这张表,需要通过什么链接和别的表建立关系,那么原文中的关系如下

app/models.py: Followers association table

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)

接下来是稍微有点难理解的地方,如果不理解,有需要的小伙伴们画图一下应该就能理解。primaryjoin代表的是从这张表出发,我连接到关系表中的什么字段?应该是“粉丝(follower)”字段,因为我关注了别人,那么我自然就是作为粉丝所以id要和follower_id 一样

secondaryjoin 就是表示我关注的那个(些)人里,他们的id应该和followed_id一样

backref就是相对于我关注那个(些)人来说,我就是followers

dynamic就是只有请求来了才去查询表

app/models.py: Followed posts query

class User(UserMixin, db.Model):
    #...
    def followed_posts(self):
        return Post.query.join(
            followers, (followers.c.followed_id == Post.user_id)).filter(
                followers.c.follower_id == self.id).order_by(
                    Post.timestamp.desc())

还有一个比较绕的点就是如果我们需要读取某个用户所关注人的微博,那么首先

Post.query.join(其他的表,条件)
表示在posts表上,用join其他的表根据条件结合起来。就相当于列出了有关注别人的某些用户的post找出来

接着filter(把自己的id和关系表中自己作为粉丝的post找出来)

order_by 根据时间排序

讲道理,这些东西,对我这种小白来说,真的是有点难以理解,但是如果写出来的话,强迫自己理解哈哈哈哈哈哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值