gpt4 book ai didi

sql - 使用Flask-SQLAlchemy进行多对多查询

转载 作者:行者123 更新时间:2023-12-03 17:18:57 26 4
gpt4 key购买 nike

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

以下是在我的数据库中创建正确表的类:

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_方法不支持模型对象。我很困惑如何在不迭代数组的情况下做到这一点,我认为这根本没有效率。有什么想法吗?在一个查询中完成此操作的奖励点...

最佳答案

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

关于sql - 使用Flask-SQLAlchemy进行多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com