2009-04-20 20 views
30

如何創建一個「AND」過濾器來檢索Django中的對象?例如,我想要檢索在單個字段中具有兩個單詞的組合的行。如何在Django過濾器中使用AND?

例如,下面的SQL查詢正是這麼做的,當我在MySQL數據庫運行:

select * from myapp_question 
where ((question like '%software%') and (question like '%java%')) 

如何使用過濾器,你做到這一點在Django?

回答

59
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar") 

更新:因爲我寫了這個答案,並做了一些Django的,但我相信這天最好的辦法是使用像大衛·伯格將q對象的方法很長一段時間顯示在這裏:stackoverflow.com/ A /63097分之770078

+3

這對Django 1.6和Postgres來說並不適合我。每當有兩個或更多相同的關鍵字時,我會收到「重複的SyntaxError:關鍵字參數」。只有David Berger提出的Q解決方案纔有效。 – margusholland 2014-05-30 07:32:54

+0

@margusholland答案適用於Django 1.6和Postgres。你能發佈你的查詢嗎?它與Q對象方法一樣正式。 https://docs.djangoproject.com/zh/dev/topics/db/queries/#spanning-multi-valued-relationships – Medorator 2014-07-08 19:15:12

+1

我有一個短國家代碼字段(cc_short)的國家: >>>國家= Country.objects.filter(cc_short__icontains ='A',cc_short__icontains ='B') 文件「」,第1行 SyntaxError:重複的關鍵字參數 – margusholland 2014-07-09 08:56:10

10

你可以連續過濾器表達式在Django:

q = Question.objects.filter(question__contains='software').filter(question__contains='java') 

您可以在 「Chaining Filters」 Django文檔的詳細信息。

57

爲了徹底起見,我們只提Q對象的方法:

from django.db.models import Q 
criterion1 = Q(question__contains="software") 
criterion2 = Q(question__contains="java") 
q = Question.objects.filter(criterion1 & criterion2) 

注意這裏的其他答案更簡單,更好地適應你的使用情況,但如果有人有類似,但稍微複雜的問題(如需要「不」或「或」)看到這一點,這是很好的參考權利在這裏。

相關問題