计数注释时得到错误值
当我用一个或两个标签进行筛选时,点赞的数量显示得很正确。但是,如果我用三个标签来筛选,点赞的数量就会被与问题相关的标签数量乘以,这样就不对了。除此之外,这个功能运行得还是不错的。点赞的实际数值在数据库里并没有改变。
def tagAndFilter(request):
tags_string = request.GET.get('tags', None)
if tags_string:
tags_list = [tag.strip() for tag in tags_string.split(',') if tag.strip()]
tags = QuestionTag.objects.filter(name__in=tags_list)
questions = Question.objects.filter(tags__in=tags).distinct()
questions = questions.annotate(likescount=Count('likes'))
context = {
'questions': questions
}
return render(request, 'question/category.html', context)
models.py
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='likes')
created_at = models.DateTimeField(auto_now_add=True)
根据我的理解,这个“乘法”结果发生在这一行
questions = questions.annotate(likescount=Count('likes'))
1 个回答
0
这个问题发生是因为JOIN操作就像是“倍增器”,也就是说,如果你在多个模型上使用JOIN,那么每个匹配的Tag
都会被重复计算很多次。
你可以通过以下方式来解决这个问题:
def tagAndFilter(request):
tags_string = request.GET.get('tags', None)
if tags_string:
tags_list = [tag.strip() for tag in tags_string.split(',') if tag.strip()]
questions = (
Question.objects.filter(tags__name__in=tags_list)
.annotate(likescount=Count('likes', distinct=True))
.distinct()
)
context = {'questions': questions}
return render(request, 'question/category.html', context)
而且其实不需要先获取QuestionTags
,我们可以直接进行JOIN操作。