我有一个应用程序有两个型号,餐厅和菜。 Dish餐厅有外国钥匙。我正在尝试使用Haystack构建单独的搜索表单,一个用于按People.name搜索,另一个用Dish.name搜索。
我无法将其分开并了解Haystack如何做到这一点。由于我在下面创建了两个索引,当我有一个SearchForm时,如果我在搜索框中键入“虾”,它将返回“烤虾”,如果我输入“ShakeShack”,结果将返回“ShakeShack”。我的目标是有一个餐馆搜索表单,如果你输入“虾”,你不应该得到任何结果,因为名称中没有“虾”的餐馆。但是现在我的表格似乎允许搜索两个模型。
我的指数:
class RestaurantIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Restaurant
class DishIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Dish
我的搜索表单:
class MySearchForm(SearchForm):
def search(self):
sqs = super(MySearchForm, self).search()
if not self.is_valid():
return self.no_query_found()
return sqs
我尝试插入sqs.models(Restaurant)
来限制只搜索/返回来自餐厅模型的结果,但它不起作用。我也试过把它放在url conf中:
SearchView(searchqueryset=SearchQuerySet().models(Restaurant)
任何帮助将不胜感激!
谢谢! 阴
更新: 我已经尝试过Hedde的建议,但仍然得到了Restaurant和Dish的结果:
class CitySearchForm(SearchForm):
models = [Restaurant]
def get_models(self):
return self.models
def search(self):
# First, store the SearchQuerySet received from other processing.
sqs = super(CitySearchForm, self).search().models(Restaurant)
if not self.is_valid():
return self.no_query_found()
return sqs
还尝试用ModelSearchForm代替SearchForm,它在我的餐厅和菜单中给了我几个复选框,但它们似乎不会影响搜索结果,无论它们是否被选中。
答案 0 :(得分:4)
另见Haystack的内置ModelSearchForm
,这样的事情应该有效:
class ModelSearchForm(SearchForm):
models = [
Restaurant
]
def get_models(self):
return self.models
def search(self):
sqs = super(MySearchForm, self).search().models(*self.get_models())
return sqs
答案 1 :(得分:1)
经过一些谷歌搜索之后,我读了一些让我知道的事情。模型()不适用于嗖嗖的后端。我正在使用飞快移动 - 神秘解决了。这是我读过的帖子:
Search within a single model with Django Haystack Haystack Whoosh Spelling Suggestion too greedy https://github.com/toastdriven/django-haystack/issues/575
有了这个,我切换到了简单的后端选项,现在我的代码使用了Hedde上面提到的修复(通过指定get_models,然后在搜索中调用该方法)。
希望这会有所帮助
答案 2 :(得分:0)
sqs = super(CitySearchForm, self).search(search_model=Restaurant)
这应该与Whoosh一起工作,因为它在使用嗖嗖的后端并且只想在一个模型中搜索时对我来说很好。