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
相关产品推荐
相关产品推荐

