을 얻는 방법 플라스크-의 정밀한 웹 애플리케이션을 빨리 빌 객체을 로드하는 관계 어린이를 위한 신사 템플릿?
-
21-12-2019 - |
문제
저는 기본 모델에 대한 사용자와 게시물입니다.내 사용자가 모델,가
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 %}
불행하게도,이 작동하지 않습니다.게시물은 쿼리하지 않는 객체 b/c lazy='dynamic'
.내가 할 수 있 위의 변경하는 경우 lazy='joined'
, 지만,그것은 것 적재 모든 게시물에 대한 사용자는 언제든지 나는 쿼리를 위한 사용자.
나도 추가 .options(joinedload('posts'))
내 쿼리,하지만 그것은 말
InvalidRequestError:'사용자.게시물'을 지원하지 않는 객체 인구 열망 선적 적용할 수 없습니다.
어떤 도움에 감사드립니다.
해결책
단순히 제거 lazy="dynamic"
인수하고 당신이 사용할 수 있는 joinedload
없이 문제입니다.(을 기억할 때 이렇게 당신이 자신을 열 하드 진단 N+1query 문제입니다.는 경우에 당신은 항상 필요한 게시물,사용 joined
대신에).
필요하신 경우 모든 행동(queriable,결합 가능,으로드),제안을 찾고 응답 이 질문, 제안하는 추가 또 다른 특성에 대한 쿼리를 동적:
class User(db.Model):
posts = db.relationship('Post', backref='user')
class Post(db.Model):
# etc.
User.posts_query = db.relationship(Post, lazy='dynamic')
다른 팁
그것은 쿼리를 개체 그렇지만,그 개체를 쿼리가 방법은 당신을 도움이 될 수 있습니다.특별히 이를 위해 사용할 경우,당신은 할 수 있습니다:
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.posts.count() }}</td>
</tr>
{% endfor %}
를 수행해야 합니다.처음()이나.모든()쿼리에 객체를 얻을 실제 물체/목록입니다.e.g
users = User.query.all()
제휴하지 않습니다 StackOverflow