私は最近、これに似たようなことをしなければなりませんでした。これを行う他の方法が見つかりませんでした。
最初に、多くのモデルで動作する Haystack の問題に対処するため、フィルターはすべての一致を返します。
Haystack は、アプリ名とモデル名に等しい django_ct と呼ばれるインデックスを作成するプロパティを使用して、バックグラウンドでモデル フィルタリングを処理します。私の特定のケースでは、のように見えましたdjango_ct='books.Title'
。
次のようにしてフィルタリングを試すことができます
SearchQuerySet.filter(content=term, django_ct='app.Model')
しかし、それがそのように機能するかどうかはわかりません。私の特定のケースでは、とにかく生の検索を行う必要があったため、フィルタリングを直接追加することができました。
sqs = SearchQuerySet()
sqs = sqs.raw_search(u'(title:(%s)^500 OR author:"%s"^400 OR "%s"~2 OR (%s)) AND (django_ct:books.Title)' % term)
SearchQuerySet
取得方法に関係なく、インデックスを更新せずに追加のフィルタリングを実行したいことを取得したら、独自のコードでそれを行う必要があります。
# each item in a queryset has a pk property to the model instance it references
pks = [item.pk for item in list(sqs)] # have to wrap sqs in a list otherwise it causes problems
# use those pks to create a standard django queryset object
results = Model.objects.filter(pk__in=pks)
# Now you can do any additional filtering like normal
results = results.exclude(published=False)
もちろん、最後の 2 つのクエリを結合することもできます。明示的にするために分割しただけです。
それほど多くのコードではありませんが、さまざまな理由で機能するまでに長い時間がかかりました。うまくいけば、それはあなたを助けます.