过滤Django Haystack的结果如QuerySet?

时间:2010-01-29 02:01:11

标签: django django-queryset django-haystack

是否可以将Django Haystack搜索与“内置”QuerySet过滤操作相结合,特别是使用SearchQuerySet不支持的Q()实例和查找类型进行过滤?按顺序排列:

haystack-searched -> queryset-filtered

queryset-filtered -> haystack-searched

浏览Django Haystack文档没有给出任何指示如何执行此操作。

3 个答案:

答案 0 :(得分:10)

您可以使用对象的PK来根据Haystack搜索的结果过滤您的查询集:

def view(request):
  if request.GET.get('q'):
    from haystack import ModelSearchForm
    form = ModelSearchForm(request.GET, searchqueryset=None, load_all=True)
    searchqueryset = form.search()
    results = [ r.pk for r in searchqueryset ]

    docs = Document.objects.filter(pk__in=results)
    # do something with your plain old regular queryset

    return render_to_response('results.html', {'documents': docs});

不确定这是如何扩展的,但对于小的结果集(在我的情况下为几百),这样可以正常工作。

答案 1 :(得分:1)

来自文档:

<强> SearchQuerySet.load_all(个体)

  

有效填充搜索结果中的对象。不使用   这种方法,DB查找是基于每个对象完成的,从而产生   许多人去数据库。如果使用load_all,则   SearchQuerySet会将类似的对象分组到一个查询中,   导致只有与不同对象类型一样多的查询   返回。

http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#load-all

因此,在使用过滤的SQS之后,可以对其执行load_all(),并通过SearchResult.object访问数据库对象。例如。

sqs = SearchQuerySet()
# filter as needed, then load_all
sqs = sqs.load_all()

for result in sqs:
    my_obj = result.object
    # my_obj is a your model object

答案 2 :(得分:0)

如果你想跟上相关性,你必须通过“对象”从数据库访问该对象:

模板中的示例:

{% for result in results %}
    {{ result.object.title }}
    {{ result.objects.author }}
{% endfor %}

但这真的很糟糕,因为haystack会在每个结果上发出额外的请求,例如“SELECT * FROM blah WHERE id = 42”。

似乎你试图从数据库中获取这些对象,因为你没有在索引中添加一些额外的字段吗?如果您在SearchIndex中添加标题和作者,则可以使用结果:

{% for result in results %}
    {{ result.title }}
    {{ result.author }}
{% endfor %}

并避免一些额外的查询。