You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:12:01