Django聚合,计数求和
我有三个模型:论坛(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()
,它其实没有任何作用。