【问题标题】:How to get Flask-SQLAlchemy object to load relationship children for Jinja template?如何让 Flask-SQLAlchemy 对象为 Jinja 模板加载关系子级?
【发布时间】:2014-03-27 23:50:00
【问题描述】:

我有 User 和 Post 的基本模型。在我的用户模型中,我有

posts = db.relationship('Post', backref='user', lazy='dynamic')

但是,当我做类似的事情时

return render_template('user.html', users=users)

我想做类似的事情

{% for user in users %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.posts|length }}</td>
    </tr>
{% endfor %}

很遗憾,这不起作用。 Posts 是一个查询,而不是 lazy='dynamic' 的对象 b/c。如果我更改lazy='joined',我可以执行上述操作,但它会在我查询用户时为用户加载所有帖子。

我尝试将.options(joinedload('posts')) 添加到我的查询中,但它说

InvalidRequestError: 'User.posts' 不支持对象填充 - 无法应用预先加载。

感谢任何帮助。

【问题讨论】:

    标签: python sqlalchemy flask jinja2 flask-sqlalchemy


    【解决方案1】:

    您必须对查询对象执行 .first() 或 .all() 以获取实际的对象/列表。 例如
    users = User.query.all()

    【讨论】:

      【解决方案2】:

      只需删除lazy="dynamic" 参数,您就可以毫无问题地使用joinedload。 (请记住,当您这样做时,您会遇到难以诊断的 N+1 查询问题。如果您总是需要这些帖子,请改用 joined)。

      如果您需要所有行为(可查询、可连接和延迟加载),我建议查看this question 的答案,其中建议为动态查询添加另一个属性:

      class User(db.Model):
          posts = db.relationship('Post', backref='user')
      
      class Post(db.Model):
          # etc.
      
      User.posts_query = db.relationship(Post, lazy='dynamic')
      

      【讨论】:

        【解决方案3】:

        这是一个query object 是的,但是这些查询对象具有可能对您有所帮助的方法。专门针对这个用例,您可以这样做:

        {% for user in users %}
            <tr>
                <td>{{ user.id }}</td>
                <td>{{ user.posts.count() }}</td>
            </tr>
        {% endfor %}
        

        【讨论】:

        • 这将导致N+1 查询(其中1 获取用户,N 是返回的用户数)因为count 将获取帖子总数为每个用户从数据库中获取此用户。
        • @SeanVieira 如果我只是需要计数,我最好使用默认lazy(即select),然后使用Jinja 的length 来获取模板中的计数,而不是使用@987654329 @ 和count()?
        • 如果您只需要User, post count,那么您完全使用单独的查询实际上要好得多 - 如果您要使用所有帖子来呈现模板,那么是的| length 是什么您不想为每个用户发出count
        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2014-10-13
        • 1970-01-01
        • 2016-06-15
        相关资源
        最近更新 更多