Django聚合,计数总和

时间:2014-06-06 07:55:49

标签: python sql database django aggregate

我有3个模型:论坛,线程,帖子和我正在创建一个视图来显示论坛列表。但我也希望显示每个论坛的主题数和帖子数。

然后我必须:

  • 计算每个帖子的帖子数
  • 总结每个论坛每个帖子的帖子数

我在这里找到了类似的东西: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,
    }))

是否可以在1个SQL查询中执行此操作?怎么样?

1 个答案:

答案 0 :(得分:6)

如果我理解正确,你可以使用

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

这会在一个数据库中生成两个注释。

第一个计算论坛上的所有主题,第二个计算论坛所有主题上的所有主题(假设thread为外键,Formpost个{ {1}} ForeignKey

threads中的确切命名取决于外键的名称,但如果不正确,Django会在建议时发出错误。

P.S。你可以删除'threads__posts__id',它没有做任何事情。