如何让Flask-SQLAlchemy对象为Jinja模板加载关系子元素?

Pat*_*Yan 7 python sqlalchemy jinja2 flask flask-sqlalchemy

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

posts = db.relationship('Post', backref='user', lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)

但是,当我做的事情

return render_template('user.html', users=users)
Run Code Online (Sandbox Code Playgroud)

我想做的事情

{% for user in users %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.posts|length }}</td>
    </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.帖子是查询,而不是b/c的对象lazy='dynamic'.如果我更改lazy='joined',我可以执行上述操作,但随后我会在查询用户时为用户加载所有帖子.

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

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

任何帮助表示赞赏.

Sea*_*ira 7

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

如果您需要所有行为(可查询,可加入和延迟加载),我建议查看此问题的答案,建议为动态查询添加另一个属性:

class User(db.Model):
    posts = db.relationship('Post', backref='user')

class Post(db.Model):
    # etc.

User.posts_query = db.relationship(Post, lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)