You need to enable JavaScript to run this app. Django函数视图如何获取所有用户点赞的Post模型实例
优惠活动
大模型
产品
解决方案
定价
更多

Django函数视图如何获取所有用户点赞的Post模型实例

问题核心梳理

需求本质是获取所有被任意用户产生过点赞行为的Post实例,过滤掉从未有任何点赞的帖子,之前两个尝试方案的偏差:

  • Post.objects.filter(likes=pk) 属于单用户维度筛选:由于likes是和User关联的多对多字段,传入单个pk值时,匹配的是「被主键为pk的特定用户点过赞的帖子」,完全不符合全局拉取所有有赞帖子的目标
  • Post.objects.all() 未做任何过滤,会把无任何点赞关联的帖子也一并返回,不符合筛选要求
可落地的实现方案

方案1:精简版查询(代码量最少)

利用多对多字段的查询特性,直接排除点赞关联记录为空的帖子:

post = Post.objects.exclude(likes=None)

方案2:聚合查询(生产环境推荐)

通过注解统计每个帖子的点赞数量做过滤,额外把每个帖子的总点赞数带入查询结果,减少后续模板渲染时的重复数据库查询,降低数据库压力:

from django.db.models import Count

post = Post.objects.annotate(
    like_count=Count('likes')
).filter(
    like_count__gt=0
)

如果需要在页面按点赞热度排序展示,可直接在查询链上补充排序规则,比如按点赞数从高到低展示:

post = Post.objects.annotate(
    like_count=Count('likes')
).filter(
    like_count__gt=0
).order_by('-like_count')
现有代码修正提示
  • 当前视图函数接收的pk参数和全局拉取有赞帖子的需求无关联,无特殊筛选要求时可直接移除该参数,同步修改对应URL路由配置去掉多余的pk传参。
  • 之前尝试代码里引用的Paintings模型名和实际定义的Post模型名不匹配,需统一修正,否则会触发模型不存在的运行报错。

修正后的完整视图示例:

from django.shortcuts import render
from django.db.models import Count
from .models import Post

def featured_paintings(request):
    post = Post.objects.annotate(
        like_count=Count('likes')
    ).filter(
        like_count__gt=0
    ).order_by('-like_count')
    context = {'post': post}
    return render(request, 'mains/featured_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.11.02 10:15:03