2012-02-03 11 views
11

मेरे पास इवेंट मॉडल उदाहरण हैं जो एक या अधिक संगठन मॉडल उदाहरणों से संबंधित हो सकते हैं। मैंने अपने सभी कार्यक्रमों को इंडेक्स करने के लिए हैस्टैक 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

मुझे लगता है कि मुझे एक समाधान मिला है। बस इसे साझा करना जाहिर है, हेस्टैक में एक एसक्यू() नामक एक वस्तु है, जो Django के Q() ऑब्जेक्ट के समान कार्य करती है। मैंने कहीं कहीं पाया है कि आप अधिक क्वेरी पैरामीटर जोड़ने के लिए Django के क्यू ऑब्जेक्ट उदाहरणों पर add() विधि का आह्वान कर सकते हैं। एसक्यू के साथ काम करने के लिए लगता है।

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

नाइस कोड: डी, ​​धन्यवाद –

संबंधित मुद्दे