【问题标题】:How to search one model only in Haystack如何仅在 Haystack 中搜索一个模型
【发布时间】:2013-08-10 00:08:17
【问题描述】:

我有一个包含两个模型的应用,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) 以限制仅搜索/返回 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,这在我的表单中为餐厅和菜肴提供了几个复选框,但无论是否选中,它们似乎都不会影响搜索结果。

【问题讨论】:

    标签: django django-haystack


    【解决方案1】:

    另请参阅 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
    

    【讨论】:

    • 我已经尝试过了,但它仍然从 Restaurant 和 Dish 模型返回结果。我已经用我尝试过的方法更新了我的问题,因为我无法让代码在评论中正确格式化。我也试过用 ModelSearchForm 代替 SearchForm。
    • 如果您不使用 whoosh 后端,此修复程序有效。请参阅下面的答案以及有关后端的其他信息。
    【解决方案2】:

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

    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,然后在搜索中调用该方法)。

    希望对你有帮助

    【讨论】:

      【解决方案3】:
      sqs = super(CitySearchForm, self).search(search_model=Restaurant)
      

      这应该适用于 Whoosh,因为它在我使用 whoosh 后端并且只想在一个模型中搜索时工作正常。

      【讨论】:

        猜你喜欢
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        相关资源
        最近更新 更多