2012-02-03 30 views
11

Mam instancje modelu zdarzeń, które mogą należeć do jednej lub więcej instancji modelu organizacji. Zaimplementowałem stację haystack 2.0.0 do indeksowania wszystkich moich zdarzeń. Oto przykładowy indeks wyszukiwania.Django Haystack: filtruj zapytanie oparte na wielu elementach na liście.

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() 

Moje pytanie brzmi: w jaki sposób skonstruować kwerendę SearchQuerySet że filtruje zdarzenia na podstawie jednej lub kilku organizacji. Na przykład, chcę znaleźć wszystkie zdarzenia, które należą do „orgnization1” i „organization3” (gdzie lista organizacji może być dowolnej długości długo)

Jako Django kwerendy może wyglądać następująco:

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

Jak mogę to przetłumaczyć na kwerendę stogu siana? To moja próba, ale ja naprawdę nie wiem, co robię ...

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

Oto przykład tego, jak wyglądają moje modele:

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) 
    ... 

Każda pomoc jest mile widziane.

Odpowiedz

18

Myślę, że znalazłem rozwiązanie. Po prostu to udostępniam. Najwyraźniej Haystack ma obiekt nazywany SQ(), który działa podobnie do obiektu Q() Django. Znalazłem gdzieś, że możesz wywołać metodę add() na instancjach obiektów Q obiektu Django, aby dodać więcej parametrów zapytania. Wydaje się działać w ten sam sposób z 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

Zdaję sobie sprawę, jest to dość stary, ale można .filter (organization_slug__in = organization_list) – Nagyman

+0

Nicea Kod: D dzięki –