python - Flask/SQLAlchemy - 无法正确查询关系

标签 python sqlalchemy

我在 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/

相关文章:

python - 如何使用python正确读取和修改文件

python - SQLAlchemy 中的 UNIQUE 约束失败

python - SQLAlchemy 列类型比较

python - SQLAlchemy 连接 2 个表

python - 使用 SqlAlchemy 在 __init__ 上一致应用东西

python - NumPy - frombuffer 和 fromstring 有什么区别?

python - Tensorflow教程中学习率的更新是如何进行的?

python - isoweek.Week 如何实现 json 可编码(python2)

python - 无法运行 MySql 实用程序

python - 组合非唯一外键来创建主键?