如何在Django中链接多功能搜索



我有一个3过滤器的工作搜索。一个是职位名称/描述/公司,一个是工作类别,例如银行,另一个是地点,例如纽约

如果我指定了任何一个过滤器,并且指定了所有3个过滤器,我如何将查询链接起来,使其呈现适当的结果?它应该执行and。我试着和if else一起做,但时间太长了。还有别的办法吗?

这是我的代码:

views.py

if request.method == "POST":
internship_desc = request.POST['internship_desc']
internship_ind = request.POST['internship_industry']
internship_loc = request.POST['internship_location']
results = []


if internship_desc != "" and internship_desc is not None:
query_results = Internship.objects.filter(
Q(internship_title__icontains=internship_desc) |
Q(internship_desc__icontains=internship_desc) |
Q(recruiter__company_name__icontains=internship_desc)
)

if internship_ind !="" and internship_ind is not None:
if internship_desc != "" and internship_desc is not None:
query_results = query_results.objects.filter(
industry_type__iexact=internship_ind)
else:
query_results = Internship.objects.filter(industry_type__iexact=internship_ind)
if internship_loc !="" and internship_loc is not None:
if internship_desc != "" and internship_desc is not None and internship_ind !="" 
and internship_ind is not None:
query_results = query_results.objects.filter(
industry_type__iexact=internship_ind)
query_results = query_results.objects.filter(
recruiter__company_region__iexact=internship_loc)

我想这就是你想要做的。

result = Internship.objects.all()
if internship_desc:
result = result.filter(internship_desc__icontains=internship_desc)
if internship_ind:
result = result.filter(industry_type__iexact=internship_ind)
if internship_loc:
result = result.filter(recruiter__company_region__iexact=internship_loc)

您最好使用django_filters进行此类筛选。

import django_filters
class InternshipFilter(django_filters.FilterSet):
company_name = django_filters.CharFilter(
field_name='recruiter__company_name',
lookup_expr='icontains'
)
class Meta:
model = Internship
fields = {
'internship_title': ['icontains'],
'internship_desc': ['icontains'],
}

并将其传递给如下模板:

context['filter_form'] = InternshipFilter().form

并在您的视图中使用它来返回过滤后的对象:

InternshipFilter(self.request.GET, queryset=Internship.objects.all()).qs

更多信息点击这里

最新更新