Django:即使通过相关模型过滤,也返回所有值

时间:2010-01-25 11:50:46

标签: django postgresql django-models

感谢上一个问题的一些很棒的帮助,我设法将我的查询放在一起。除了一个问题,一切都在游泳。

    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。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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)或所有没有矮人的职业(基于null)