1

Restaurant と Dish という 2 つのモデルを持つアプリがあります。皿にはレストランへの外部キーがあります。私は、Haystack を使用して別の検索フォームを作成しようとしています。1 つは Restaurant.name で検索するためのもので、もう 1 つは 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 の提案を試しましたが、まだレストランとディッシュの両方から結果が得られています:

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

また、SearchForm を ModelSearchForm に置き換えてみました。これにより、フォームにレストランと料理のチェックボックスがいくつか表示されますが、チェックされているかどうかに関係なく、検索結果に影響を与えないようです。

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バックエンドで機能しないことを知らせるいくつかのことを読みました。私はwhooshを使用していました-謎は解決しました。ここに私が読んだ投稿があります:

Django Haystack Haystack Whoosh Spelling Suggestion too greedy を使用して単一のモデル内で検索する

それで、単純なバックエンド オプションに切り替えたところ、コードは Hedde が上で提案した修正で動作するようになりました (get_models を指定し、検索でそのメソッドを呼び出すことにより)。

お役に立てれば

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

これは、whoosh バックエンドを使用していて、1 つのモデルのみで検索したい場合にうまく機能しているため、Whoosh で機能するはずです。

于 2014-08-12T04:47:09.880 に答える