2014-06-06 93 views
3

我有3个模型:论坛,主题,发布和我正在创建一个视图来显示论坛列表。但我也想显示每个论坛的帖子数量和帖子数量。Django聚合,总数

我接下来要:

  • 计数的职位数为每个线程
  • 和每个线程的职位数为每个论坛

我发现类似的东西在这里: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查询中执行此操作?怎么样?

回答

5

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

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

这使得在一个数据库中命中两个注解。

第一计数论坛上的所有线程,第二计数论坛上(假设threadForm一个ForeignKey的所有线程的所有帖子和post一个ForeignKeythreads

确切的命名中'threads__posts__id'依赖于外键的名称,但Django会吐出一个错误与建议,如果他们是不正确的。

PS你可以删除.all(),它没有做任何事情。

+0

谢谢,这就像一个魅力。 :) – valentin