最近在学一篇大神写的有关于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 根据时间排序
讲道理,这些东西,对我这种小白来说,真的是有点难以理解,但是如果写出来的话,强迫自己理解哈哈哈哈哈哈哈哈哈