2009-07-22 44 views
4

我期待創建一個稍微複雜一點的查詢,使用原始SQL可以很容易地編寫。這裏的原始查詢的例子:Django的ORM查詢使用過濾器()和Q對象的組合

選擇我,領域銷售WHERE is_paid =虛假或狀態= 'toship' AND otherfield = '富' 和anotherfield = 'BAR'

這很簡單,它會生成所有is_paid = False的結果,然後爲我的AND匹配生成第二個結果集。

現在我知道關於Q對象,我知道過濾,但我似乎無法包裝我的頭腦圍繞如何在Django ORM乾淨地實現這一點。

任何提示?

感謝

回答

19

您可以繼續建立您的問與答對象幾分時尚動感。

例子:

query1 = Q(is_paid=False) 

query2 = Q() 

if status: 
    query2 = Q(status=status) 

if otherfield: 
    query2 = query2 & Q(otherfield=otherfield) 

if anotherfield: 
    query2 = query2 & Q(anotherfield=anotherfield) 

query = query1 | query2 

result = model.objects.filter(query) 
2

像這樣的東西應該工作:

model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR')) 

編輯: 不能創建動態地被執行,你可以構建一個包含SQL語句的字符串以相同的方式查詢完成後。如果你想這樣做,我會建議使用的,如果狀態,功能或什麼最適合你的使用情況:

if query == 'simple': 
    result = model.objects.filter(Q(is_paid=False)) 
else: 
    result = model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR')) 
for items in result: 
    ... 

這可能是比較複雜的,但我敢肯定你的想法。

+1

好吧,我現在猜我的問題。假設我有一個基本上是這樣的查詢: model.objects.filter(Q(is_paid = False)) 我想用一些動態值將另一個Q對象添加到該查詢中,以產生基本相同的查詢你發佈了,但它會動態創建。這就是我在這種情況下掙扎的地方。 我將如何實現這一目標? – Bartek 2009-07-22 15:53:32

+0

不要忘記從django.db.models導入Q – 2017-06-13 14:43:17

13

儘管googletorp是正確的,你不能動態地使用字符串構造查詢,但你可以使用來完成字典參數。喜歡的東西:

model.objects.filter(Q(**mydict1) | Q(**mydict2)) 

其中mydict1和2的形式爲:

{'field1': 'value1'} 
{'field2__icontains': 'value2'} 

+0

是的,它很好做。 – kn3l 2009-12-30 08:21:01

1

這是做動態 「或」 查詢一個偉大的方式:

import operator 
from django.db.models import Q 
from your_app.models import your_model_object 

q_list = [Q(question__startswith='Who'), Q(question__startswith='What')] 
your_model_object.objects.filter(reduce(operator.or_, q_list)) 
如果你想用 「AND」

your_model_object.objects.filter(reduce(operator.and_, q_list))