2015-11-07 18 views
0

我建立一個搜索功能,以多個T/F過濾選項,像這樣:Django的Q對象 - 返回真假兩比賽

Search: ________________ 

Filters: 
___ Open to Public 
___ Parking Available 
_x_ Free Entrance 

在這種情況下,用戶專找那些免費活動進入。我希望我的Q對象返回關鍵字匹配的對象,其中free_entrance設置爲True。

我的想法是在我的搜索功能來定義變量:

search_public = None 
search_parking = None 
search_free_entrance = True 

,並設置Q對象像這樣:

q_objects.append(
    Q(
     name__icontains=search_term, 
     public__icontains=search_public, 
     parking__icontains=search_parking, 
     free_entrance=search_free_entrance 
    ) 
) 

不過,我想所有對象(TRUE或FALSE)返回未變量變量(而不是僅設置爲None的對象)。是否有我可以插入的關鍵字,或者是否存在我缺少的Q對象過濾器類型?

UPDATE: 除了公佈答案,* ARGS也可用於複雜(OR)問對象:

來源: http://www.nomadjourney.com/2009/04/dynamic-django-queries-with-kwargs/

args = (Q(name__icontains = 'search_term') | Q(company__icontains = 'search_term')) 

回答

1

使用kwargs:

search = {'name__icontains': search_term} 
if search_public is not None: 
    search.update({'public__icontains': search_public}) 
if search_parking is not None: 
    search.update({'parking__icontains': search_parking}) 
if search_free_entrance is not None: 
    search.update({'pree_entrance__icontains': search_free_entrance}) 
q_objects.append(Q(**search)) 

或更復雜的示例(您的問題來自評論):

search_kwargs = {'name__icontains': search_term} 
search_args = tuple() 
if search_public is not None: 
    search_args += (Q(Q(company__icontains=search_public) | Q(other__icontains=search_public)),) 
q_objects.append(Q(*search_args, **search_kwargs)) 
+0

好主意!謝謝! –