Django博客应用如何实现查询request.user未点赞的博文列表
问题定位与修复方案
现有代码问题
- Exists子查询缺少与外层BlogPost的关联条件,当前写法判断的是登录用户是否给任意博文点过赞,而非判断是否给当前遍历的单篇博文点赞,所以标注的is_liked字段完全不符合预期
- 视图中现有查询逻辑矛盾:先筛选登录用户点赞过的博文,再排除同一条件的结果,最终返回结果必然不符合筛选需求
正确实现方式
方式1:基于Exists实现(适合需要同时返回是否点赞标记的场景)
需要引入OuterRef关联外层查询的博文主键,代码如下:
from django.db.models import Exists, OuterRef def unliked_posts(request): # 子查询:判断当前用户是否给外层对应的单篇博文点过赞 user_like_subquery = Like.objects.filter( user=request.user, blog=OuterRef('pk') ) posts = BlogPost.objects.annotate( is_liked=Exists(user_like_subquery) ).filter(is_liked=False) context = {'posts':posts} return render(request, 'unliked_posts.html', context)
方式2:基于反向关联直接排除(仅需要筛选未点赞博文时更简洁)
不需要额外导入模块,直接通过反向外键排除即可:
def unliked_posts(request): posts = BlogPost.objects.exclude(like__user=request.user) context = {'posts':posts} return render(request, 'unliked_posts.html', context)
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

