У объекта 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, получать только идентификаторы для текущей страницы, а не все идентификаторы, а затем страницу.

Другие вопросы по тегам