2012-02-03 14 views
11

1つ以上の組織モデルインスタンスに属するイベントモデルインスタンスがあります。私はhaystack 2.0.0を実装して、すべてのイベントをインデックスに登録しました。次に、検索インデックスの例を示します。Django Haystack:リスト内の複数の項目に基づくフィルタクエリ。

class EventIndex(indexes.SearchIndex, indexes.Indexable): 

    text = indexes.CharField(document=True, use_template=True) 
    organization_slug = indexes.CharField(model_attr='organization__slug', 
         weight=5.0) 
    organization_name = indexes.CharField(model_attr='organization__name', 
         weight=5.0) 
    name = indexes.CharField(model_attr='name', weight=10.0) 

    ....  

    def get_model(self): 
     return Event 

    def index_queryset(self): 
     return Event.objects.filter() 

私の質問はどのように私は1つまたは複数の組織に基づいてイベントをフィルタリングSearchQuerySetクエリを構築するんです。例えば、私はジャンゴのよう

(ここで、組織のリストが長い任意の長さで可能)「orgnization1」と「organization3」に属するすべてのイベントを見つけたい、それは次のようになります照会:

Event.objects.filter(organization__in=[orgnization1, organization3]).filter(...) 

haystackクエリに変換するにはどうすればよいですか?これは私の試みですが、私は本当に私がやっているかわからない...

organization_list = [organization1.slug, organization2.slug] 
SearchQuerySet().filter_or(organization__contains=organization_list) 

ここに私のモデルがどのように見えるかの例です:

class Event(models.Model): 
    name = models.CharField(max_length=64) 
    organization = models.ForeignKey('mymodule.Organization') 
    ... 

class Organization(models.Model): 
    slug = models.SlugField(max_length=64) 
    name = models.CharField(max_length=64) 
    ... 

すべてのヘルプははるかに高く評価されます。

答えて

18

私は解決策を見つけたと思います。ちょうどそれを共有する。どうやら、HaystackにはSQ()というオブジェクトがあり、これはDjangoのQ()オブジェクトと同じように機能します。 DjangoのQオブジェクトインスタンスでadd()メソッドを呼び出して、より多くのクエリパラメータを追加できる場所が見つかりました。 SQと同じように動作するようです。

from haystack.forms import SearchForm 
from haystack.query import SQ, SearchQuerySet 
from haystack.views import SearchView 

class CustomSerchView(SearchView): 


    def __call__(self, request): 

     self.request = request 

     ########### Custom stuff 
     user = request.user 
     organization_list = [organization1.slug, organization2.slug, ....] 

     sq = SQ() 
     for slug in organization_list: 
      sq.add(SQ(organization_slug=slug), SQ.OR) 
     sqs = SearchQuerySet().filter(sq)   
     ########## 

     self.form = self.build_form(form_kwargs={'searchqueryset':sqs}) 
     self.query = self.get_query() 
     self.results = self.get_results() 
     return self.create_response() 
+6

私はこれはかなり古いです実現していますが、.filterできる(organization_slug__in = organization_list) – Nagyman

+0

ニースコード:D、感謝 –