【问题标题】:reading from joined query in flask-sqlalchemy从 flask-sqlalchemy 中的连接查询中读取
【发布时间】:2017-05-29 16:22:20
【问题描述】:

成功加入两个数据库表后,我试图通过寻址第一个表来读取第二个表中的数据。我正在使用我的 jinja2 模板发送 opinion.topic_name,但没有返回任何内容。 如何从联接查询中访问 Topic.topic_name 值?

查看

@main.route('/', methods=['GET', 'POST'])
def index():
    form = IndexForm()
    opinions = []
    if form.validate_on_submit():
        opinions = Opinion.query
                    .filter_by(party_id=form.party.data)
                    .filter_by(topic_id=form.topic.data)
                    .join('topic')
                    .all()
    return render_template('index.html', form=form, opinions=opinions)

型号

class Opinion(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(2000))
    topic_id = db.Column(db.Integer, db.ForeignKey('topic.id'))
    party_id = db.Column(db.Integer, db.ForeignKey('party.id'))

class Topic(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    topic_name = db.Column(db.String(64))
    opinions = db.relationship(Opinion, backref='topic')

模板(jinja2)

<div>
    {{ wtf.quick_form(form) }}
</div>
<div>
    {% for opinion in opinions %}
    <div class='jumbotron'>
        <h1>{{ opinion.topic_name }}</h1>
        <p>{{ opinion.text }}</p>
    </div>
    {% endfor %}
</div>

【问题讨论】:

  • 可能,您应该在模板中调用 opinion.topic.topic_name 而不是 opinion.topic_name

标签: python flask jinja2 flask-sqlalchemy flask-wtforms


【解决方案1】:

这个查询:

opinions = Opinion.query
                    .filter_by(party_id=form.party.data)
                    .filter_by(topic_id=form.topic.data)
                    .join(Topic)
                    .all()

将返回意见模型列表,并且由于在Topic 模型中的关系中,您将其定义为:

opinions = db.relationship(Opinion, backref='topic')

然后,在您的 jinja2 模板中,要访问 Topic.topic_name,您应该这样做:

&lt;h1&gt;{{ opinion.topic.topic_name }}&lt;/h1&gt;

【讨论】:

  • 按照您提议的顺序,查询返回错误sqlalchemy.exc.InvalidRequestError: Entity '&lt;class 'app.models.Topic'&gt;' has no property 'party_id'。我以前试过你的订单,但不明白为什么它不起作用。 jinja2 模板中的解决方案解决了这个问题!
  • 我认为在我的订单中,filter_by args 将指的是Topic 表而不是Opinion 表,我已经相应地更新了我的答案。
  • @JoostBarendregt,如果您对此答案有其他疑虑,请将它们添加到 cmets 中,否则,如果它确实解决了您的问题,请接受它,并且可能会竖起大拇指 :)
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 2015-03-10
  • 1970-01-01
  • 2016-05-08
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多