我在search_indexes.py中有3个带有3个索引的模型,如(Modelname1Index,ModelName2Index,Modelname3Index)。
SearchQuerySet()。过滤器是从这三个中搜索的,但我想分别搜索它们。
所以,我试着这样做:
SearchQuerySet().filter(text=query).models(required_model_name)
但是,它返回的是整个搜索(来自所有模型)的结果,而不是来自所提到的单个模型。
此外,在进行重建索引时,没有为第三个模型索引的对象,因为该模型没有任何行。
因此,.models(thirdmodel)返回空结果,但.models(其他两个模型中的任何一个)返回整个结果。
答案 0 :(得分:3)
不幸的是,.models()
过滤器无法正常使用Haystack和Whoosh的最新版本。
您可以通过将Haystack降级到2.0.0并将Whoosh降级到2.4.1来解决此问题。
另请注意,使用Whoosh时,在配置中尝试使用HAYSTACK_SEARCH_RESULTS_PER_PAGE
时会出现错误,因此您最好避免使用此设置。
但这并不太可怕。
答案 1 :(得分:1)
This is based partlyon James Lims answer,但这适用于任何版本的Haystack和Whoosh。不幸的是,任何一方都没有真正解决这个问题,但下面的解决方案似乎并不太糟糕。
class MySearchQuerySet(SearchQuerySet):
def models(self,*mods):
# We have to redefine this because Whoosh & Haystack don't play well with model filtering
from haystack.utils import get_model_ct
mods = [get_model_ct(m) for m in mods]
return self.filter(django_ct__in=mods)
然后SearchQuerySet
改为使用MySearchQuerySet
:
MySearchQuery().filter(name="foo").models(my_models.bar,my_models.baz)