我正在使用多个T / F过滤器选项构建搜索功能,如下所示:
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对象过滤器类型?
更新: 除了发布的答案,* args也可以用于复杂(OR)Q对象:
自: http://www.nomadjourney.com/2009/04/dynamic-django-queries-with-kwargs/
args = ( Q( name__icontains = 'search_term' ) | Q( company__icontains = 'search_term' ) )
答案 0 :(得分: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))