Django 视图中的多个过滤器参数
我有一个基本的搜索视图。它当前查询数据库中来自特定客户机的任何对象。查看代码如下:Django 视图中的多个过滤器参数,django,django-views,Django,Django Views,我有一个基本的搜索视图。它当前查询数据库中来自特定客户机的任何对象。查看代码如下: def search_page(request): form = PrdSearchForm() prdlinks = [] show_results = True if request.GET.has_key('query'): show_results = True que
def search_page(request):
form = PrdSearchForm()
prdlinks = []
show_results = True
if request.GET.has_key('query'):
show_results = True
query = request.GET['query'].strip()
if query:
form = PrdSearchForm({'query' : query})
prdlinks = \
ProjectRecord.objects.filter(client__icontains=query)
if len(prdlinks) >= 1:
records = ProjectRecord.objects.filter(client__icontains=query)
t = get_template('org_list_client.html')
html = t.render(Context({'records': records}))
return HttpResponse(html)
else:
tpl = "prd_search.html"
variables = RequestContext(request, { 'form': form,
'prdlinks': prdlinks,
'show_results': show_results})
return render_to_response(tpl, variables)
我希望搜索字段按客户端和帐户检查对象。我认为,这将涉及修改此代码:
if query:
form = PrdSearchForm({'query' : query})
prdlinks = \
ProjectRecord.objects.filter(client__icontains=query)
要包括ProjectRecord.objects.filter(account\u icontains=query)
。有人能帮我解释一下语法吗?或者我想完成的工作还有其他方面吗?你可以试试,比如:
这将首先过滤包含查询的客户端,然后过滤该结果查询集,其中帐户也包含查询
一般形式:
>>> Entry.objects.filter(
... headline__startswith='What'
... ).exclude(
... pub_date__gte=datetime.now()
... ).filter(
... pub_date__gte=datetime(2005, 1, 1)
... )
文档中包含了更多有用的示例:
def search_page(request):
form = PrdSearchForm()
prdlinks = []
**acclinks = []**
show_results = True
if request.GET.has_key('query'):
show_results = True
query = request.GET['query'].strip()
if query:
form = PrdSearchForm({'query' : query})
prdlinks = \
ProjectRecord.objects.filter(client__icontains=query)
**acclinks = \
ProjectRecord.objects.filter(account__icontains=query)**
if len(prdlinks) >= 1:
records = ProjectRecord.objects.filter(client__icontains=query)
t = get_template('org_list_client.html')
html = t.render(Context({'records': records}))
return HttpResponse(html)
**elif len(acclinks) >= 1:
records = ProjectRecord.objects.filter(account__icontains=query)
t = get_template('org_list_account.html')
html = t.render(Context({'records': records}))
return HttpResponse(html)**
else:
tpl = "prd_search.html"
variables = RequestContext(request, { 'form': form,
'prdlinks': prdlinks,
'show_results': show_results})
return render_to_response(tpl, variables)
我认为您正在寻找
Q
对象(由MYYN引用)
我认为这种链条在这种情况下不可行。例如,如果我的客户是,比如说施乐,并且该客户在我的“复印机foo”和“复印机bar”中有两个帐户。如果“copier bar”是我的搜索词,则筛选器将搜索名为“copier bar”的客户端,并为辅助帐户筛选器返回0个对象的查询集。将继续搜索文档。Gracias。尝试导入Q对象。问题是,如果我不将prdlinks与acclinks分开,Q查询将适用于客户端对象,因为它满足第三个“if”查询:“if len(prdlinks)>=1:…”但是如果搜索项是帐户名(与客户端名相反),则查询将返回“prdlink”但是不返回任何记录,因为if查询正在查找(client\uu icontains=query)。结果是它呈现一个空模板。(并且不会继续计算以下请求的“elif”查询(account\uu icontains=query))。
def search_page(request):
form = PrdSearchForm()
prdlinks = []
**acclinks = []**
show_results = True
if request.GET.has_key('query'):
show_results = True
query = request.GET['query'].strip()
if query:
form = PrdSearchForm({'query' : query})
prdlinks = \
ProjectRecord.objects.filter(client__icontains=query)
**acclinks = \
ProjectRecord.objects.filter(account__icontains=query)**
if len(prdlinks) >= 1:
records = ProjectRecord.objects.filter(client__icontains=query)
t = get_template('org_list_client.html')
html = t.render(Context({'records': records}))
return HttpResponse(html)
**elif len(acclinks) >= 1:
records = ProjectRecord.objects.filter(account__icontains=query)
t = get_template('org_list_account.html')
html = t.render(Context({'records': records}))
return HttpResponse(html)**
else:
tpl = "prd_search.html"
variables = RequestContext(request, { 'form': form,
'prdlinks': prdlinks,
'show_results': show_results})
return render_to_response(tpl, variables)
from django.db.models import Q
records=ProjectRecord.objects.filter(
Q(client__icontains=query) |
Q(account__icontains=query)
)