Django Q Objects - 返回True和False匹配

时间:2015-11-07 18:36:33

标签: django django-queryset django-q

我正在使用多个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' ) )

1 个答案:

答案 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))