当我按术语/单词搜索时,会出现 TypeError :
异常值:“搜索”类型的对象没有len()
这是我的代码:
views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Q, Search
@login_required
def search(request):
q = request.GET.get('q')
client = Elasticsearch()
paginate_by = 1
if q:
s = Search(using=client, index='people')
s = s.highlight('name', 'cpf', 'rg', 'people_nick.nickname')
q = Q("multi_match", query=q, fields=['nome', 'cpf', 'rg']) | \
Q("nested", path="people_nick", query=Q(
"match", people_nick.nickname=q))
s = s.query(q)
paginator = Paginator(s, paginate_by)
page = request.GET.get("page")
try:
people = paginator.get_page(page)
except PageNotAnInteger:
people = paginator.get_page(1)
except EmptyPage:
people = paginator.get_page(paginator.num_pages)
else:
s = ''
total_results = False
time_response = False
return render(request, 'search/result.html', {
'people': s,
})
寻找解决方案,我按照此answer创建代理,如下所示:
from django.utils.functional import LazyObject
class SearchResults(LazyObject):
def __init__(self, es):
self._wrapped = es
def __len__(self):
return self._wrapped.count()
def __getitem__(self, index):
search_results = self._wrapped[index]
if isinstance(index, slice):
search_results = list(search_results)
return search_results
...而且,在上面的 views.py 中,我添加了:
(...)
s = s.query(q)
s = SearchResults(s) # <--- added here
paginator = Paginator(s, paginate_by)
(...)
因此,当我按一个返回多个页面的术语( num_pages )进行搜索时,不会发生异常,并且第一页中的项目数与参数 per_page匹配。但是当我在页面上导航时,异常 UnboundLocalError 会引发,显示消息:
异常值:分配前引用的局部变量'people'
我做错了什么?有人可以帮帮我吗?
Ps¹ :当我使用Django的shell(没有Proxy类)执行所有这些步骤时,一切都像魅力一样。
Ps² :我正在使用 django == 2.0.5 , django-elasticsearch-dsl == 0.5.0 , elasticsearch-dsl == 6.1.0 。
英语不是我的母语,请原谅我的任何错误:)