2011-05-09 65 views
1

我想计算我列出的对象。在Django中计算外键和ManyToMany中的对象

我想统计每个标题中的问题数量。

这是我的models.py如何设置:

# Edited out 

Views.py:

def titles (request): 
    all_titles = Title.objects.all().order_by('title') 
    num_titles = Title.objects.all().count() 
    latest_titles = Title.objects.order_by('-date_added') 
    title_a = Title.objects.filter(title__startswith='A') 
    title_b = Title.objects.filter(title__startswith='B') 

    ......etc...... 

我需要为创作者和人物就此别过,除了他们在许多以与问题和意见的许多关系基本上看起来相同def titles

谢谢。

+0

这将是有用的,如果模型没有编辑了 - 这个问题有点棘手理解没有他们。 – penguin 2016-03-06 07:29:13

回答

16

要获得每个标题的相关问题,可以使用向后关系查找。由于您没有在创建关系的问题模型中指定相关名称,因此使用_set附加到相关模型的底部名称来执行查找。在你的情况issue_set

some_title = Title.object.get(pk=1) 
some_title.issue_set.count() 

但是,这将执行一个数据库命中您要计数的每个标题。

您可能想要用计数注释标题qs。 docs

from django.db.models import Count 
titles_with_counts = Title.objects.all().annotate(issue_count=Count('issue__id')) 

现在在QS每个标题已经算访问使用.issue_count

for title in titles_with_counts: 
    print title.title, title.issue_count 
+0

那么,这样做与模板中什么都没有出现,或者我可能只是愚蠢的。我觉得我的问题是,我按照字母表中的第一个字母对标题进行排序,并且我不希望它计算标题中以A开头的所有问题。 – AAA 2011-05-09 03:32:05

+1

'from django.db.models import Count' ' title_a = Title.objects.filter(title__startswith ='A')。annotate(issue_count = Count('issue__id'))'并在您的模板中{{title for title_a%} {title.title}} {{title .issue_count}} {%endfor%}' – DTing 2011-05-09 03:41:42

+0

您的问题不是问题,因为您的过滤器应用于标题,而不是问题。过滤并计算所有相关问题后,注释正在通过每个标题。这些问题从未被过滤。 – DTing 2011-05-09 03:44:48