是否可以将Django Haystack搜索与“内置”QuerySet过滤操作相结合,特别是使用SearchQuerySet不支持的Q()实例和查找类型进行过滤?按顺序排列:
haystack-searched -> queryset-filtered
或
queryset-filtered -> haystack-searched
浏览Django Haystack文档没有给出任何指示如何执行此操作。
答案 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 %}
并避免一些额外的查询。