У объекта 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})
Traceback Переключиться в режим копирования и вставки
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in
get_response
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 ответа
Я полагаю, что ваши результаты запроса отсутствуют
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)
Удачи Сэм
Вы должны проверить GetLastError и, возможно, GetLastWarning, прежде чем пытаться использовать query_results, чтобы убедиться, что запрос выполнен успешно.
Бонус, который вы получите, чтобы узнать, ПОЧЕМУ запрос не удался. Возможно, было бы лучше, если бы API вызывал правильные исключения при сбоях, но это не так.
Еще один момент, ваш setLimits невероятно высок, вполне возможно, что он не смог получить слишком много результатов.
На самом деле вы должны делать пейджинг непосредственно в sphinx, получать только идентификаторы для текущей страницы, а не все идентификаторы, а затем страницу.