Django筛选投票数≤0的Answer时0票数据无法返回如何解决
问题原因
likes是多对多关联字段,直接使用filter(likes__lte=0)并非统计点赞数量,而是在匹配多对多关联表中关联的用户ID是否小于等于0,自然无法得到预期结果。- 尝试
likes__level__lte=0报错是因为likes关联的是User模型,User模型不存在level字段,因此触发无效查询字段的报错。 - 之前筛选
lte=1仅返回1赞回答属于巧合:你的写法实际匹配的是关联了ID=1的用户的回答,而这些回答刚好只有1个点赞,所以出现了看似匹配到1赞回答的误判。
解决方案
方案1:注解统计点赞数后筛选(适用所有数值范围的点赞数筛选)
先导入Django的计数函数:
from django.db.models import Count
修改查询代码为:
def answers(request): # 先给每个回答注解点赞数量,再筛选点赞数<=0的结果 answers = Answer.objects.annotate(like_count=Count('likes')).filter(like_count__lte=0).count() context = {'answers':answers} return render(request, 'answers.html', context)
方案2:直接筛选无关联的多对多字段(仅适用点赞数为0的场景)
如果只需要统计没有任何点赞的回答,可以用更简洁的写法:
def answers(request): # 多对多字段isnull=True代表没有关联任何用户,即点赞数为0 answers = Answer.objects.filter(likes__isnull=True).count() context = {'answers':answers} return render(request, 'answers.html', context)
内容的提问来源于stack exchange,提问作者user16559633
相关产品推荐
相关产品推荐

