我的导航栏中有一个搜索框,可以向名为search
的视图发送查询。在search
中,我检查数据库以查看搜索内容是否存在,如果存在则重定向到/thing/name
:
def search(request):
try:
search_string = request.GET['q']
except MultiValueDictKeyError:
raise Http404
try:
Thing.objects.get(name=search_string)
return HttpResponseRedirect('/thing/{}'.format(search_string))
except Thing.DoesNotExist:
# do something else...
在我的thing
视图中,我想要显示有关该事物的一些信息,需要完全相同的数据库查找:
def thing(request, name):
thing= Thing.objects.get(name=name)
# do something with thing...
我的问题是,如何执行重定向,而无需进行相同的数据库查找?我可以以某种方式缓存查找吗?
答案 0 :(得分:1)
我不确定你是否会通过这样做获得很大的性能提升,原因在于你将以某种方式从第二页的硬盘驱动器中读取结果。无论是采用再次从数据库中提取还是从缓存中读取的形式,仍然需要进行读取。解决方法可能是检查搜索词是否存在而不在第一个视图中拉出完整的db行。您可以通过执行count()
来完成此操作def search(request):
try:
search_string = request.GET['q']
except MultiValueDictKeyError:
raise Http404
if Thing.objects.filter(name=search_string).count() == 1:
return HttpResponseRedirect('/thing/{}'.format(search_string))
else:
# Thing doesn't exist, or there are multiple entries for Thing
这也意味着将处理任何返回多个结果的搜索,而原始代码没有这样做。