2013-05-06 20 views
1

我一個Django初學者,我想出如何動態地創建一個模型查詢,但我被困在某些時候,當我特林混合ANDOR運營商:如何在Django查詢中混合使用AND和OR運算符?

我的字段列表(CONTACT_NAME,公司,職位,國家),這些字段可能包含多個關鍵字(以逗號分隔,'')

因此,如果我搜索這些公司名稱「imtech,ABC,FooBar」,我會得到正確的結果我有下面,因爲它總是使用|(OR)運算符。

但是,如果我想限制搜索公司字段的條目爲「imtech,ABC,FooBar」,並且只將位置字段設置爲「客戶經理」,該怎麼辦?

我知道我必須將&運算符放在每個字段循環的末尾,但我還沒有成功完成,所以這裏是我的代碼,請幫助我!

search_fields = {'contact_name', 'company', 'position', 'country'} 
search_fields_values = {} 
qs_params = None 

for field in search_fields: 
    search_fields_values[field] = self.request.GET.get(field, None) 
    if search_fields_values[field]: 
     search_fields_values[field] = search_fields_values[field].split(',') 

     for part in search_fields_values[field]: 
      q = Q(**{field: part}) 
      qs_params = qs_params | q if qs_params else q 

qs = qs.filter(qs_params) 

非常感謝!

回答

1

我希望我能正確理解你的問題。

這裏是在理論上應該工作(沒有測試它雖然):

import operator 

... 

search_fields = {'contact_name', 'company', 'position', 'country'} 

conditions = [] 
for name in search_fields: 
    value = self.request.GET.get(name, None) 
    if value: 
     conditions.append(Q(**{name + "__in": value.split(',')})) 

qs = qs.filter(reduce(operator.and_, conditions)) 

所以,兩種想法進入了我的腦海:

  • 使用__in而不是幾個手術室
  • 爲每個搜索字段收集這些in查詢,然後將它們與AND連接起來

希望有所幫助。

+0

你是我的男人alecxe!非常感謝,這正是我所期待的。 – Oms 2013-05-06 21:15:13

相關問題