2015-09-14 19 views
2

我試圖在django sqlite數據庫中實現搜索。如何爲django Q對象動態加入多個參數

我得到一個未知長度的參數列表,它應該都與'LIKE'匹配。這意味着我需要至少匹配其中一個參數的所有對象。

正如我從django文檔中看到的,我可以通過使用Q對象來實現。

例子:

Students.objects.get(
    Q(name_contains='franz') | 
    Q(birthdate_date=date(2005, 5, 2) | 
    Q(param3_contains='lorem' 
) 

現在的問題是,我該怎麼處理它加入所有從PARAMS創建將q對象作爲參數傳遞給objects.get()。我在這找不到任何東西。

這裏的另一個問題是處理幾種不同的字段查找類型。

我欣賞任何建議,幫助或幫助您可以給的鏈接。謝謝。

+0

不清楚你「加入Q對象」的意思,如果你想和他們在一起,你可以使用['&'](https://docs.djangoproject.com/en/1.8/ REF /模型/查詢集/#q-對象)。另外你的例子似乎有不正確的字段查找語法,它應該是像'name__contains'兩個下劃線。 –

+0

我的意思是我不知道我得到哪些參數。所以它可能是2,3或7個參數。我必須遍歷它們,將它們放在Q對象中,然後將它們作爲參數傳遞給我的get函數。但我不知道我如何將這些論點與|連接在一起。所以我明確地想要使用OR。 – Igle

回答

5

如果要動態地構建查詢列表,你可以有這樣的順序:

request = Q(name_contains='franz') 

if condition1: 
    request |= Q(birthdate_date=date(2005, 5, 2)) 

if condition2: 
    request |= Q(param3_contains='lorem') 

然後:

Students.objects.get(request) 

如果你需要的東西更通用的,你可以有通過一個字典的功能,如:

conditions = {'name_contains': 'franz', 
       'birthdate_date': date(2005, 5, 2), 
       'param3_contains': 'lorem'} 

並建立這樣的條件(未經測試):

request = None 
for key, value in conditions: 
    new_request = Q(**{key: value}) 

    if request: request |= new_request 
    else: request = new_request 
0

我在我的應用程序中有類似的要求。我必須尋找各種名稱的搜索關鍵詞:

Qterm = Q(firstname__icontains=searchterm) | \ 
     Q(lastname__icontains=searchterm) | \ 
     Q(resume__icontains=searchterm) | \ 
     Q(companyname__icontains=searchterm)) 

,或者,如果你想要一個字段匹配到數searchterms的:

Qterm = Q() 
for term in ["robot", "animatronic", "automaton"]: 
    Qterm |= Q(rolename_icontains=term) 

fieldname_icontains最終成爲一個LIKE。還有更多的標準,這樣的用戶應該是「積極的」,這是一個布爾字段:

Qactive = Q(active=True) 

最後,我將所有這些問與答對象是這樣的:

Qs = Qterm & Qactive & Qthis & Qthat 

。 ..我檢索我這樣的活躍用戶:

userlst = Users.objects.filter(Qs) 

我希望這有助於!

+0

我認爲他希望查詢集獲得動態數量的參數,而不僅僅是一個'searchterm'。 –

+0

是的,你可能是對的。我在我的回答中加了這個。 –