如何用SQLAlchemy查询未被当前用户审核的图片文件名?
解决方案:查询未被当前用户审核的图片文件名
咱们先拆解下你的需求:要找所有picture_type是photograph,而且**当前用户还没审核(也就是没留过评论)**的图片文件名。你的原语句之所以只返回已审核的,是因为几个细节没处理对:
- 原语句的
filter(Picture.filename == Comment.filename)把outerjoin硬生生变成了innerjoin——只有两边都匹配的记录才会被保留,自然只能拿到有评论的图片; - 没有限定“当前用户”的条件,所以就算能拿到数据,也是所有用户评论过的图片,不是针对特定用户的。
下面给你两种可行的修改方案,选哪种都可以:
方案一:用Outer Join + 空值过滤
这种方式通过左连接关联当前用户的评论记录,然后筛选出没有关联到评论的图片:
# 假设当前用户的ID存在current_user_id变量里 session.query(Picture.filename)\ .filter(Picture.picture_type == 'photograph')\ .outerjoin( Comment, # 关联条件:文件名匹配 + 评论属于当前用户 and_(Picture.filename == Comment.filename, Comment.user_id == current_user_id) )\ # 筛选出当前用户没有评论过的(评论记录为空) .filter(Comment.user_id == None)\ .all()
方案二:用NOT EXISTS子查询
这种写法逻辑更直观,直接检查“当前用户是否没有对该图片留过评论”:
from sqlalchemy import exists, and_ # 子查询:检查当前用户是否对某张图片有评论 comment_exists_subquery = exists().where( and_( Comment.filename == Picture.filename, Comment.user_id == current_user_id ) ) session.query(Picture.filename)\ .filter(Picture.picture_type == 'photograph')\ # 取反:只保留当前用户没评论过的图片 .filter(~comment_exists_subquery)\ .all()
两种方案都能实现你的需求,你可以根据自己的代码习惯选择~
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

