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)

伟大的非常感谢。我修复了第一部分,现在它可以工作了。我待会再看另一个。我还有一个模板问题。再次感谢,太好了!非常感谢。我修复了第一部分,现在它可以工作了。我待会再看另一个。我还有一个模板问题。再次感谢。