有没有办法连接 q 个对象?
Is there a way to concatenate with q objects?
我一直在努力实现它。我正在尝试构建一个动态查询集,其中条件将基于用户输入。用户可以决定按名字或姓氏或两者的组合进行搜索。如果仅按姓氏搜索,则不会将名字查询添加到查询集中。我目前正在使用它来搜索所有输入的字段。
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')
您可以 join Q
objects using |
,它充当 "or":
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 would give you similar benefits and allow users to construct Google-like queries using AutoQuery 设置搜索后端。例如,使用 -
来排除一个术语和一个精确短语的引号。
您可以像这样连接 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)
为了简化示例,我缩短了过滤器参数
我一直在努力实现它。我正在尝试构建一个动态查询集,其中条件将基于用户输入。用户可以决定按名字或姓氏或两者的组合进行搜索。如果仅按姓氏搜索,则不会将名字查询添加到查询集中。我目前正在使用它来搜索所有输入的字段。
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')
您可以 join Q
objects using |
,它充当 "or":
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 would give you similar benefits and allow users to construct Google-like queries using AutoQuery 设置搜索后端。例如,使用 -
来排除一个术语和一个精确短语的引号。
您可以像这样连接 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)
为了简化示例,我缩短了过滤器参数