使用Django / Haystack / SOLR,我希望能够将搜索结果限制在特定django_ids范围内的记录中。获取这些ID不是问题,但尝试通过它们进行过滤会产生一些意想不到的效果。代码看起来像这样(为了清晰起见,修剪了无关的代码):
def view_results(request,arg):
# django_ids list is first calculated using arg...
sqs = SearchQuerySet().facet('example_facet') # STEP_1
sqs = sqs.filter(django_id__in=django_ids) # STEP_2
view = search_view_factory(
view_class=SearchView,
template='search/search-results.html',
searchqueryset=sqs,
form_class=FacetedSearchForm
)
return view(request)
在标记为STEP_1的点上,我获得了所有数据库记录。在STEP_2,记录成功地缩小到对于django_ids列表所期望的数字I。如果在用户在表单中指定了搜索词的情况下显示搜索结果,则会出现问题。我不是从STEP_2中返回与该术语匹配的所有记录,而是从STEP_2中获取所有来自STEP_1的记录,这些记录与该术语匹配。
因此,据推测,我需要在haystack / views.py中覆盖SearchView中的一个/一些方法,但是什么呢?任何人都可以提出实现这里所需要的方法吗?
答案 0 :(得分:0)
经过一番思考后,我找到了解决方法。在上面的代码中,问题发生在view = search_view_factory...
行,所以我需要创建自己的SearchView类并覆盖get_results(self)
方法,以便在搜索运行后应用过滤用户的搜索字词。结果是这些代码:
class MySearchView(SearchView):
def get_results(self):
search = self.form.search()
# The ID I need for the database search is at the end of the URL,
# but this may have some search parameters on and need cleaning up.
view_id = self.request.path.split("/")[-1]
view_query = MyView.objects.filter(id=view_id.split("&")[0])
# At this point the django_ids of the required objects can be found.
if len(view_query) > 0:
view_item = view_query.__getitem__(0)
django_ids = []
for thing in view_item.things.all():
django_ids.append(thing.id)
search = search.filter_and(django_id__in=django_ids)
return search
最后使用search.filter_and
而不是search.filter
是另一件事,结果证明是必不可少的,但在进行过滤之前,我没有做过滤所需要的事情。搜索查看。