2010-01-25 48 views
1

感谢上一个问题的一些奇妙帮助,我设法整理了我的查询。一切工作都可以保存一个问题。Django:即使通过相关模型进行筛选,也会返回所有值

careers = Career.objects.filter(job__dwarf__user = 1).annotate(dwarves_in_career = Count('job__dwarf')) 

在我看来,这不正是我想要的,当我环在我的模板像这样:

{% for career in careers reversed %} 
    <li>{{ career.name }}: {{ career.dwarves_in_career }}</li> 
{% endfor %} 

我得到了我的预期。我的问题是,上面的代码只会返回有矮人的职业。我需要它返回所有职业:

Unassigned: 1 
Construction: 1 
Crafting: 2 
Gathering: 0 
Farming: 0 

是我预期的结果。相反,最后两行不在那里,因为我正在筛选特定用户。我知道为什么会发生这种情况,我试图弄清楚的是如何让查询返回所有职业,即使他们对于特定用户的矮人数是0.

+1

+1'dwarves_in_career' 。头脑非常混乱。 – 2010-01-25 13:58:44

回答

0

所以,我终于想通了......

from django.db.models import Count, Q 

def fortress(request): 
    careers = Career.objects.filter(Q(job__dwarf__user = 1) | Q(job__dwarf__user__isnull = True)).annotate(dwarves_in_career = Count('job__dwarf')) 
    return render_to_response('ragna_base/fortress.html', {'careers': careers}) 

究竟知道什么Q是但它的工程!

点击此处了解详情:http://www.djangoproject.com/documentation/models/or_lookups/

基本上就是我做的是寻找具有矮人(基于user_ID的)所有职业或有没有矮人所有职业(基于零)

0

我认为您需要将您的annotatefilter子句。请参见the documentation on this - 您拥有它的方式,它会过滤查询集,但您实际上希望保留整个查询集,但只是过滤注释

+0

我看到你在哪里,但不幸的是这不会工作。不拉我无耻的职业的原因是因为他们没有相应的user_id。即使没有矮人,我也需要一种获得职业生涯的方式。 – TheLizardKing 2010-01-25 16:42:44

相关问题