使用elasticsearch-dsl在django中分页不起作用

时间:2018-06-01 16:36:02

标签: python django elasticsearch-dsl paginator

当我按术语/单词搜索时,会出现 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

英语不是我的母语,请原谅我的任何错误:)

0 个答案:

没有答案