【发布时间】:2021-05-26 23:43:30
【问题描述】:
我有一个烧瓶应用程序,它混合使用了 sqlalchemy (ORM) 和烧瓶 sqlalchemy。
我有一个用户模型、一个帖子模型和一个关注者表,如下所示:
from app import db
from flask_login import UserMixin
from sqlalchemy.orm import relationship
class User(UserMixin, db.Model)
id = db.Column(db.Integer, primary_key=True)
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') # many to many relationship with other Users
posts = relationship('Post') # one to many relationship with posts
# ...
class Post(db.Model)
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
#...
followers= db.Table('followers',
db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
我的问题是如何查询 Post 表/模型,以便它只返回关注您的用户(即朋友)撰写的帖子。
flask mega tutorial by Miguel Grinberg(这些模型的基础)使用以下 sqlalchemy 查询来完成与我所追求的类似的事情。
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 表仅与关注者的子集连接,其特点是如果 (a,b) 在关注者中,然后是 (b,a) 在关注者中。我只是不确定如何实现这一点。
任何帮助将不胜感激。此外,如果有人推荐一个指南,可以在没有大量纯 SQL 先决条件知识的情况下进行更“高级”的 sqlalchemy 查询,例如上面的查询,请告诉我。 提前致谢!
【问题讨论】:
-
我猜你只是在 Miguels 的案例中切换
def followed_posts(self): ...查询中的followed_id和follower_id:他列出了你关注的人的帖子,所以反之将是那些关注的人的帖子跟着你。 -
感谢@van 的建议。这比原始查询更接近我所追求的。但就我而言,我仍然需要检查两个用户是否相互关注。
标签: flask sqlalchemy flask-sqlalchemy