2011-12-19 48 views
0

我正在編寫一個視圖,該視圖根據用戶選擇的搜索字段搜索我的模型數據庫。基本的代碼是一樣的東西:Django與kwargs的複雜搜索

def search(request): 
if submit in request.POST: 
    ... 
    kwargs = {} 
    if request.POST['field1']: 
     kwargs['field1__icontains'] = request.POST['field1'] 

    if request.POST['field2']: 
     kwargs['field2__icontains'] = request.POST['field2'] 
    ... 
    results_list = Mymodel.objects.filter(**kwargs) 
    ... 

當然,這是好的,如果我的查詢是所有和聲明,但如果我需要在拋出一個或者出現 - 這可能嗎?例如,如果我需要field2__icontains = request.POST['field2']field3__icontains = request.POST['field2']

回答

2

建立一個Q()對象而不是字典,當你在你的領域工作。那麼你可以按照你的意願andor

query = Q() 
if request.POST['field1']: 
    query &= Q(field1__icontains=request.POST['field1']) 
if request.POST['field2'] and request.POST['field3']: 
    query &= (Q(field2__icontains=request.POST['field2']) | Q(field3__icontains=request.POST['field3'])) 
results_list = MyModel.objects.filter(query) 
+0

啊好的。這似乎是要走的路。似乎我癡迷於kwargs;)謝謝! – 2011-12-19 12:24:27

+0

順便說一句 - '&='和'+ ='之間有區別嗎? – 2011-12-19 13:09:18

+0

'&'是按位和'。 '+'是加法。它們不可互換,也不是'&='和'+ =' – Alasdair 2011-12-19 13:33:45