Django 'NoneType'对象没有'__getitem__'属性
我看了这篇文章 http://eshlox.net/en/2012/09/13/sphinxsearch-and-django-ubuntu/
在视图中,我遇到了一个错误,代码是:total = query_results['total']
错误信息是:'NoneType'对象没有这个属性 'getitem'
def search(request):
if request.GET:
form = SearchForm(request.GET)
query = request.GET.get('q', '')
s = SphinxClient()
s.SetServer('localhost', 9312)
s.SetLimits(0, 16777215)
if s.Status():
query_results = s.Query(query)
total = query_results['total']
pages_id = [page['id'] for page in query_results['matches']]
if pages_id:
results = Page.objects.filter(id__in=pages_id)
else:
results = None
if results:
paginator = Paginator(results, 25)
page = request.GET.get('page')
try:
results = paginator.page(page)
except PageNotAnInteger:
results = paginator.page(1)
except EmptyPage:
results = paginator.page(paginator.num_pages)
return render(request, 'wiki/search.html',
{'results': results,'total': total,
'query': query, 'form': form})
else:
logger = logging.getLogger('helper')
logger.error('Sphinxsearch Error! %s' % s.GetLastError())
messages.add_message(request, messages.ERROR, 'Search server is '
'not responding. Administrator '
'has been informed.')
form = SearchForm()
return render(request, 'wiki/search.html', {'form': form})
else:
form = SearchForm()
return render(request, 'wiki/search.html', {'form': form})
错误追踪信息切换到复制粘贴视图
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in
获取响应
response = wrapped_callback(request, *callback_args, **callback_kwargs) ... ▶ Local vars /home/max/askmoiseev/ask/views.py in search total = query_results['total'] ... ▶ Local vars
请告诉我可能是什么错误?
2 个回答
0
在你尝试使用查询结果之前,应该先检查一下GetLastError和可能的GetLastWarning,以确保查询成功。
这样做的好处是你可以知道查询失败的原因。其实,如果这个接口在出错时能抛出合适的异常,那就更好了,不过它并没有这样做。
还有一点,你的setLimits设置得太高了,可能是因为试图获取太多结果而导致失败。
其实,你应该直接在sphinx中进行分页,只获取当前页面的ID,而不是先获取所有ID再进行分页。
4
我想你的查询结果是 None。
query_results = s.Query(query)
所以当你尝试访问
total = query_results['total']
时,你会遇到 __getitem__
错误,因为 None 不是一个列表。
这里有一个来自解释器的例子。
>>> n = None
>>> n['b']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
>>>
试着在命令行中运行这个查询 - django-admin.py shell
然后
s = SphinxClient()
s.SetServer('localhost', 9312)
s.SetLimits(0, 16777215)
query_results = s.Query(query)
祝你好运,
Sam