gpt4 book ai didi

python - sqlalchemy:滥用临时字段

转载 作者:行者123 更新时间:2023-12-01 06:05:17 28 4
gpt4 key购买 nike

我有一个声明如下关系的数据结构(伪代码):

class User:
...
class Rating:
rater = User
post = Post
class Post:
ratings = hasmany(Rating)
page_id = ...

我正在使用这些模型构建一个网站,但我很懒,所以我将当前登录的用户和当前页面上的一堆帖子传递给我的模板。我的页面需要知道登录用户对每个帖子的评分,因此我使用 SQLAlchemy 的每 session 一个实例功能:

posts = session.query(Post).filter(Post.page_id==current_pageid)
ratings = session.query(Post, Rating)\
.filter(Rating.rater==user.id)\
.filter(Post.page_id==current_pageid)
for post in posts:
post.user_rating = None # default value
for post, rating in ratings:
post.user_rating = rating

然后我将我的模板传递给帖子列表。这是丑陋可怕的做法吗?我可以用更好的方法吗?

最佳答案

您所做的已经足够好了,只是您的查询在 PostRating 之间缺少 WHERE 子句:

# ...
.filter(Post.id==Rating.post_id)\

但是您也可以通过一次查询获得结果:

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 属性。您应该谨慎返回 session 绑定(bind)对象(例如对 View 的查询)。像上面的相同代码一样返回列表会更安全。要修复您的代码,只需将 .all() 添加到查询中即可:

posts = session.query(Post).filter(Post.page_id==current_pageid).all()

关于python - sqlalchemy:滥用临时字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com