2010-01-25 47 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

相關問題