Django: вернуть все значения, даже если выполняется фильтрация по связанной модели - PullRequest
1 голос
/ 25 января 2010

Благодаря некоторой фантастической помощи по предыдущему вопросу мне удалось собрать свой запрос. Все работает плавно, за исключением одного вопроса.

    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 голосов
/ 25 января 2010

Итак, я со временем разобрался ...

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)

0 голосов
/ 25 января 2010

Я думаю, вам нужно поменять местами предложения annotate и filter. См. документацию по этому - так, как у вас есть, она фильтрует набор запросов , но вы действительно хотите сохранить весь набор запросов, а просто отфильтровать аннотации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...