我在 Flask 中有以下代码。我希望用户能够关注指定的 RSS 源,该源保存在“relationships_feed”表中,但我无法正确获得此输出。
模型
class Relationships_Feed(db.Model):
__tablename__ = 'relationships_feed'
feed_id = db.Column(db.Integer, db.ForeignKey('feeds.id'), primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
class Feed(db.Model):
__tablename__ = 'feeds'
id = db.Column(db.Integer, primary_key=True)
feed_url = db.Column(db.String(255), index=False, unique=True)
feed_name = db.Column(db.String(64), index=True)
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
confirmed = db.Column(db.Boolean, default=False)
first_name = db.Column(db.String(64), index=True)
last_name = db.Column(db.String(64), index=True)
email = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
feeds = db.relationship('Feed', secondary='relationships_feed', backref='user', lazy='dynamic')
以下是我在解决问题时如何调用代码。
预期结果是 user.feeds 根据 relationships_feed 表中的数据返回他订阅的所有 Feed。
调用代码
users = db.session.query(User)
for user in users:
print (user.first_name)
print (user.last_name)
print (user.email)
print (user.feeds)
输出(数据库中的假数据)
11:21:40 web.1 | Robert
11:21:40 web.1 | Williams
11:21:40 web.1 | svelazquez@jones.org
11:21:40 web.1 | SELECT feeds.id AS feeds_id, feeds.feed_url AS feeds_feed_url, feeds.feed_name AS feeds_feed_name
11:21:40 web.1 | FROM feeds, relationships_feed
11:21:40 web.1 | WHERE ? = relationships_feed.user_id AND feeds.id = relationships_feed.feed_id
我收到的只是原始查询本身,这让我觉得我没有正确查询它,但我已经阅读了多个指南和文档,但仍然无法解决。这是我缺少的一个简单修复吗?
最佳答案
You need to call
.all()
on a lazy relationship
feeds = db.relationship('Feed', secondary='relationships_feed', backref='user', lazy='dynamic')
在您的模型中,您使这种关系变得惰性,这意味着在访问 feeds
属性时,它不会获取所有项目,但您必须通过调用 user 显式获取所有这些项目.feeds.all()
或像迭代器一样使用它。
for feed in user.feeds:
print(feed)
您可以一次获取所有提要
feeds = user.feeds.all()
在您的场景中,
for user in users:
print (user.first_name)
print (user.last_name)
print (user.email)
print (user.feeds.all()
关于python - Flask/SQLAlchemy - 无法正确查询关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43695251/