【问题标题】:Django: Return all Values even if filtering through a related modelDjango:即使通过相关模型过滤也返回所有值
【发布时间】:2010-01-25 11:50:45
【问题描述】:

感谢对上一个问题的一些出色帮助,我设法将我的查询放在一起。一切正常运行,节省了一个问题。

    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 表示dwarves_in_career。头脑难以置信。

标签: django postgresql django-models


【解决方案1】:

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

【讨论】:

  • 我知道你在哪里,但不幸的是这不起作用。它没有拉动我的侏儒职业的原因是因为他们没有相应的 user_id。即使没有矮人,我也需要一种获得职业的方法。
【解决方案2】:

所以,我终于想通了……

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2017-06-22
    • 2021-01-20
    • 2020-01-19
    • 2020-12-21
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多