我最近不得不做类似的事情,这很痛苦。我找不到任何其他方法来做到这一点。
首先解决 Haystack 在许多模型上工作的问题,因此 filter 返回所有匹配项:
Haystack 使用它索引的名为 django_ct 的属性在后台处理模型过滤,该属性等于应用程序名称和模型名称。在我的特殊情况下,它看起来像django_ct='books.Title'
.
您可以尝试通过执行过滤
SearchQuerySet.filter(content=term, django_ct='app.Model')
但我不知道它是否会那样工作。在我的特殊情况下,无论如何我都必须进行原始搜索,因此我可以直接将过滤添加到其中:
sqs = SearchQuerySet()
sqs = sqs.raw_search(u'(title:(%s)^500 OR author:"%s"^400 OR "%s"~2 OR (%s)) AND (django_ct:books.Title)' % term)
不管你如何得到它,在你得到SearchQuerySet
你想要在不更新索引的情况下进行额外过滤之后,你必须用你自己的代码来做。
# each item in a queryset has a pk property to the model instance it references
pks = [item.pk for item in list(sqs)] # have to wrap sqs in a list otherwise it causes problems
# use those pks to create a standard django queryset object
results = Model.objects.filter(pk__in=pks)
# Now you can do any additional filtering like normal
results = results.exclude(published=False)
当然,您可以结合最后两个查询,我只是将它们拆分为明确的。
代码不多,但由于各种原因,我花了很长时间才让它工作。希望它可以帮助你。