Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLAlchemy进行复杂的多对多查询_Sql_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

使用SQLAlchemy进行复杂的多对多查询

使用SQLAlchemy进行复杂的多对多查询,sql,flask,sqlalchemy,flask-sqlalchemy,Sql,Flask,Sqlalchemy,Flask Sqlalchemy,我有两个表,一个是用户表,另一个是tweets表。用户可以关注其他用户,也可以关注最喜欢的推文(包括多对多关系) 以下是在my 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 U

我有两个表,一个是用户表,另一个是tweets表。用户可以关注其他用户,也可以关注最喜欢的推文(包括多对多关系)

以下是在my 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'))
现在,我尝试执行的查询是从给定用户正在跟踪的用户中选择所有喜欢的tweet。因此,有些东西的效果是:

user = User.query.get(user_id)
Tweet.query.filter(Tweet.favorited.in_(user.following))
这不起作用,因为方法中的
不支持模型对象。如何在不遍历数组的情况下完成这项工作,我感到很困惑,我认为这样做根本没有效率。有什么想法吗?在一次查询中完成此操作的奖励积分

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