有没有一种方法可以连接q个对象?

时间:2019-03-29 17:23:26

标签: django-models django-views django-orm qobject

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

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')

2 个答案:

答案 0 :(得分:0)

您可以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的查询。例如,使用-排除一个词和一个确切短语的引号。

答案 1 :(得分:0)

您可以像这样连接 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)

为了简化示例,我缩短了过滤器参数