繁体   English   中英

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

[英]Django: Return all Values even if filtering through a related model

由于对先前的问题提供了出色的帮助,我设法将查询组合在一起。 一切工作顺利,省了一个问题。

    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。

我认为您需要交换您的annotatefilter子句。 这个文件 -你有它的方式,它过滤的查询集 ,但你真的想保持整个查询集,但只是过滤注释

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM