2012-02-03 102 views
11

我有可以屬於一個或多個組織模型實例的事件模型實例。我已經實施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() 

我的問題是我怎麼構建一個SearchQuerySet查詢過濾器基於一個或多個組織活動。例如,我想找到屬於「orgnization1」和「organization3」的所有活動(其中的機構名單可任意長度長)

作爲一個Django查詢它可能是這個樣子:

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

如何將其轉換爲乾草堆查詢?這是我的嘗試,但我真的不知道我在做什麼...

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 2014-01-09 17:34:25

+0

尼斯代碼:d,謝謝 – 2015-07-31 14:12:46

相關問題