1

我有一个包含两个模型的应用程序,Restaurant 和 Dish。Dish 有一个指向 Restaurant 的外键。我正在尝试使用 Haystack 构建单独的搜索表单,一个供人们按 Restaurant.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 的建议,但仍然从餐厅和菜肴中得到结果:

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,这在我的表单中为 Restaurant 和 Dish 提供了几个复选框,但无论是否选中它们似乎都不会影响搜索结果。

4

3 回答 3

4

另请参阅 Haystack 的 builtin 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
于 2013-08-10T09:37:07.530 回答
1

在谷歌搜索之后,我读到了一些让我知道 .models() 不适用于 whoosh 后端的东西。我正在使用嗖嗖声 - 谜团解开了。这是我读过的帖子:

在单个模型中搜索 Django Haystack Haystack Whoosh Spelling Suggestion too greedy https://github.com/toastdriven/django-haystack/issues/575

有了这个,我切换到简单的后端选项,现在我的代码可以使用 Hedde 上面建议的修复(通过指定 get_models,然后在搜索中调用该方法)。

希望这可以帮助

于 2013-08-21T19:38:35.477 回答
0
sqs = super(CitySearchForm, self).search(search_model=Restaurant)

这应该适用于 Whoosh,因为它在使用 whoosh 后端并且只想在一个模型中搜索时对我来说很好。

于 2014-08-12T04:47:09.880 回答