使用Flask-SQLAlchemy复杂多对多查询

时间:2014-08-05 21:21:15

标签: sql flask sqlalchemy flask-sqlalchemy

我有两个表,一个是用户表,另一个是推文表。用户可以关注其他用户和用户可以收藏的推文(多对多关系)。

以下是在我的db中创建正确表的类:

follow = db.Table('follow',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('following_id', db.Integer, db.ForeignKey('user.id'))
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    following = db.relationship('User', 
        secondary = follow, 
        primaryjoin = (follow.c.follower_id == id), 
        secondaryjoin = (follow.c.following_id == id), 
        backref = db.backref('followers'))

favorite = db.Table('favorite',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('tweet_id', db.Integer, db.ForeignKey('tweet.id'))
)

class Tweet(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    favorited = db.relationship('User', secondary=favorite,
        backref=db.backref('favorites'))

现在,我尝试执行的查询是从给定用户关注的用户中选择所有受欢迎的推文。所以有一些效果:

user = User.query.get(user_id)
Tweet.query.filter(Tweet.favorited.in_(user.following))

这不起作用,因为in_方法不支持模型对象。我没有在没有遍历数组的情况下难以理解如何做到这一点,我认为这些数据无论如何都是有效的。有什么想法吗?在一个查询中执行此操作的奖励点...

1 个答案:

答案 0 :(得分:2)

user_id = ?
qry = (db.session.query(Tweet)
        .join(User, Tweet.favorited)
        .filter(User.followers.any(User.id == user_id))
        )