有没有办法与 q 对象连接?

Posted

技术标签:

【中文标题】有没有办法与 q 对象连接?【英文标题】:Is there a way to concatenate with q objects? 【发布时间】:2019-03-29 17:23:26 【问题描述】:

我一直在努力实现这一点。我正在尝试构建一个动态查询集,其中条件将基于用户输入。用户可以决定按名字或姓氏或两者的组合进行搜索。如果仅按姓氏搜索,则不会将名字查询添加到查询集中。我目前正在使用它来搜索所有输入的字段。

results = documents.objects.filter(
    Q(f_filer__filer_first_name__istartswith=request.GET.get('first_name', 
'')) & (f_filer__filer_last_name__istartswith=request.GET.get('last_name', 
'')) & 
Q(f_office__o_office_name__istartswith=request.GET.get('office_name', ''))
    & Q(f_doc_year__exact=request.GET.get('report_year', ''))
    & Q(f_report_id__exact=request.GET.get('filing_type', ''))       
    ).values('f_filer__filer_first_name',
          'f_filer__filer_last_name',
          'f_office__o_office_name',
          'f_date_received',
          'f_start_travel_date',
          'f_end_travel_date',
          'f_doc_year',
          'f_report__r_title')

【问题讨论】:

【参考方案1】:

您可以像这样连接 filter

queryset = documents.objects.all()

first_name = request.GET.get('first_name')
last_name = request.GET.get('last_name')

if first_name:
    queryset = queryset.filter(first_name=first_name)
if last_name:
    queryset = queryset.filter(last_name=lastname)

我已缩短过滤器参数以简化示例

【讨论】:

太棒了!这正是我一直在寻找的。没有我想的那么复杂。谢谢!【参考方案2】:

您可以join Q objects using |,它充当“或”:

first_name = request.GET.get('first_name', '')
last_name = request.GET.get('last_name', '')
Q(
    f_filer__filer_first_name__istartswith=first_name,
    f_filer__filer_last_name__istartswith=last_name
) |
Q(f_filer__filer_first_name__istartswith=first_name) |
Q(f_filer__filer_last_name__istartswith=last_name)

如果您的应用程序搜索量很大,则可能值得考虑设置适当的搜索后端。

你使用 Postgres 吗?如果是这样,使用 Django 的 Postgres Full text search 可能会简化事情并有助于使代码更易于维护。

如果您不使用 Postgres,使用 django-haystack 设置搜索后端会给您带来类似的好处,并允许用户使用 AutoQuery 构建类似 Google 的查询。例如,使用- 排除一个术语和一个精确短语的引号。

【讨论】:

以上是关于有没有办法与 q 对象连接?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法构造一个 Q 对象,它代表一个 EmptyQueryset,即总是返回一个空结果?

获取对象中的单个索引以与 api 调用连接

c与数据库连接的详细步骤

node.js http服务器,检测客户端何时断开连接

有没有办法用一行在同一个对象上调用多个函数?

转ora-12545:因目标主机或对象不存在,连接失败的解决办法 .