Django 'NoneType'对象没有'__getitem__'属性

-1 投票
2 回答
4306 浏览
提问于 2025-04-18 08:12

我看了这篇文章 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

撰写回答