То, что вы делаете, достаточно хорошо, за исключением того, что в вашем запросе отсутствует предложение WHERE
между Post
и Rating
:
# ...
.filter(Post.id==Rating.post_id)\
Но вы также можете получить результат в одномquery:
qry = (session.query(Post, Rating).
outerjoin(Rating, and_(Post.id==Rating.post_id, Rating.user_id==user.id)).
filter(Post.page_id==current_pageid)
)
res = qry.all() # you can return *res* already to a view, but to get to your results, do below as well:
for post, rating in res:
post.user_rating = rating
posts = [post for post, rating in res]
return posts
Обратите внимание, что в вашем случае posts
на самом деле не список, а запрос, и если вы выполните итерацию по нему во второй раз, вы можете потерять атрибут user_rating
.Вы должны быть осторожны при возвращении связанных с сеансом объектов, таких как запрос к представлению.Более безопасно возвращать списки, как в том же коде выше.Чтобы исправить свой код, просто добавьте .all()
к запросу:
posts = session.query(Post).filter(Post.page_id==current_pageid).all()