Django聚合,计数求和

5 投票
1 回答
3085 浏览
提问于 2025-04-18 08:50

我有三个模型:论坛(Forum)、主题(Thread)和帖子(Post),我正在创建一个视图来显示论坛的列表。但我还想显示每个论坛的主题数量和帖子数量。

所以我需要:

  • 计算每个主题的帖子数量
  • 把每个论坛中所有主题的帖子数量加起来

我在这里找到了一些类似的内容:Django: Sum the count of a sub sub foreign object,但那个答案对我不管用。

from django.shortcuts import render
from django.template import Context
from django.contrib.auth.decorators import login_required
from django.db.models import Count

from chinwag.models import Forum, Thread, Post

@login_required
def forums(request):
    forums = Forum.objects.annotate(num_posts=Count('threads__posts')).all(
            ).select_related('threads__last_post')
    return render(request, 'chinwag/forums.html', Context({
        'forums': forums,
    }))

有没有可能用一条SQL查询语句来实现?怎么做?

1 个回答

7

如果我理解得没错,你可以使用

Forum.objects.annotate(num_threads=Count('threads__id'),
                       num_posts=Count('threads__posts__id'))

这样做可以在一次数据库查询中进行两个统计。

第一个统计的是论坛上的所有主题,第二个统计的是所有主题下的所有帖子(假设一个thread是和Form的外键,post是和threads的外键)。

'threads__posts__id'中的具体命名取决于外键的名称,但如果不正确,Django会报错并给出建议。

另外,你可以去掉.all(),它其实没有任何作用。

撰写回答