Django QuerySet API:如何加入iexact和icontains?
我有这样的想法:Django QuerySet API:如何加入iexact和icontains?,django,django-queryset,Django,Django Queryset,我有这样的想法: lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name) 如果你尝试姓:阿巴斯,名:Amr,它告诉你,Amr阿巴斯有1个同学 但是如果你试着只取名字,它会说数据库中没有律师,叫做amr,显然有 如果我将last\uu iexact=last\u name更改为last\uu icontains=last\u name,则将last name留空可以正常
lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name)
如果你尝试姓:阿巴斯,名:Amr,它告诉你,Amr阿巴斯有1个同学
但是如果你试着只取名字,它会说数据库中没有律师,叫做amr,显然有
如果我将last\uu iexact=last\u name更改为last\uu icontains=last\u name,则将last name留空可以正常工作,并找到amr
但是如果你搜索collin,你也会得到collins和collingwood,这不是我想要的
你知道我如何使用iexact,如果它是空的,也可以忽略它吗
谢谢
这是查看功能:
def search_form(request):
if request.method == 'POST':
search_form = SearchForm(request.POST)
if search_form.is_valid():
last_name = search_form.cleaned_data['last_name']
first_name = search_form.cleaned_data['first_name']
lawyers = Lawyer.objects.filter(last__iexact=last_name).filter(first__icontains=first_name)
if len(lawyers)==0:
form = SearchForm()
return render_to_response('not_in_database.html', {'last': last_name, 'first': first_name, 'form': form})
if len(lawyers)>1:
form = SearchForm(initial={'last_name': last_name})
return render_to_response('more_than_1_match.html', {'lawyers': lawyers, 'last': last_name, 'first': first_name, 'form': form})
q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True)
q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True)
lawyers1 = Lawyer.objects.filter(school__iexact=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=last_name)
form = SearchForm()
return render_to_response('search_results.html', {'lawyers': lawyers1, 'last': last_name, 'first': first_name, 'form': form})
else:
form = SearchForm()
return render_to_response('search_form.html', {'form': form, })
您不必一次性构建QuerySet
lawyers = Lawyer.objects.all()
if last_name:
lawyers = lawyers.filter(last__iexact=last_name)
if first_name:
lawyers = lawyers.filter(first__icontains=first_name)
Django在需要计算QuerySet之前不会对其进行计算。在本例中,len调用强制它进行计算,因此您可以在准备运行查询之前一直堆积过滤器
此外,以后不需要创建新的查询集,只需使用现有的查询集即可
q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True)
q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True)
可以是:
q_school = lawyers.values_list('school', flat=True)
q_year = lawyers.values_list('year_graduated', flat=True)
您不必一次性构建QuerySet
lawyers = Lawyer.objects.all()
if last_name:
lawyers = lawyers.filter(last__iexact=last_name)
if first_name:
lawyers = lawyers.filter(first__icontains=first_name)
Django在需要计算QuerySet之前不会对其进行计算。在本例中,len调用强制它进行计算,因此您可以在准备运行查询之前一直堆积过滤器
此外,以后不需要创建新的查询集,只需使用现有的查询集即可
q_school = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('school', flat=True)
q_year = Lawyer.objects.filter(last__icontains=last_name).filter(first__icontains=first_name).values_list('year_graduated', flat=True)
可以是:
q_school = lawyers.values_list('school', flat=True)
q_year = lawyers.values_list('year_graduated', flat=True)
伟大的非常感谢。我修复了第一部分,现在它可以工作了。我待会再看另一个。我还有一个模板问题。再次感谢,太好了!非常感谢。我修复了第一部分,现在它可以工作了。我待会再看另一个。我还有一个模板问题。再次感谢。