2013-11-26 29 views
0

我爲我的網站製作了一個搜索功能,用空格分隔輸入的文本,然後用__contains檢查每項工作。我想擴大這個範圍,這樣我就可以通過我希望它檢查__contains的列,比如「First name」,「Last Name」...等。Django使用數組查詢列值

我現在擁有的一切:

def getSearchQuery(search,list,columns=None): 
     """ 
     Breaks up the search string and makes a query list 
     Filters the given list based on the query list 
     """ 
     if not columns: 
      columns = { name } 
     search = search.strip('\'"').split(" ") 
     for col in columns: 
      queries = [Q(col__contains=value) for value in search] 
      query = queries.pop() 

      for item in queries: 
       query |= item 

     return list.filter(query) 

問題是Q(col__contains =值)does not工作爲 「山口」 不是列。有沒有辦法告訴Django這是一個變量,而不是實際的列?我已經嘗試了谷歌搜索這個,但老實說,不知道如何在沒有把我的所有代碼的短語。

+0

我不知道,但如果你只需要改變'Q(col__contains =值)'來'Q(COL + '__包含'=值)'在自己的代碼,不這行得通? –

+0

嗯,這導致「太多的值解開(預期2)」,但它似乎是在正確的軌道上 – user2508385

+0

query = queries.pop()'將在下一次迭代中重寫'query'? –

回答

0

這樣來做:

import operator 
from functools import reduce 

def getSearchQuery(search, list, columns=None): 
    """ 
    Breaks up the search string and makes a query list 
    Filters the given list based on the query list 
    """ 
    if not columns: 
     return list 
    search = search.strip('\'"').split(" ") 
    queries = [] 
    for col in columns: 
     queries.extend([Q((col+'__icontains', value)) for value in search]) 

    return list.filter(reduce(operator.or_, queries)) 
+0

我得到「全球名稱」減少'未定義「。是不是減少了一個內置的python函數? – user2508385

+0

是的,它是內置功能。你正在使用哪個Python版本? –

+0

我有Python 3.2。如果我在我的代碼中使用查詢| =項目的方式,它會創建所有查詢語句,但當我嘗試過濾時,我會得到「許多要解壓縮的值」。任何想法? – user2508385