计数注释时得到错误值

1 投票
1 回答
19 浏览
提问于 2025-04-13 15:02

当我用一个或两个标签进行筛选时,点赞的数量显示得很正确。但是,如果我用三个标签来筛选,点赞的数量就会被与问题相关的标签数量乘以,这样就不对了。除此之外,这个功能运行得还是不错的。点赞的实际数值在数据库里并没有改变。

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操作。

撰写回答