【问题标题】:Django Q Objects - Return both True and False matchesDjango Q Objects - 返回真假匹配
【发布时间】:2016-02-08 18:07:44
【问题描述】:

我正在构建具有多个 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' ) )

【问题讨论】:

    标签: django django-queryset django-q


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2014-09-07
      • 2012-07-17
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多