2012-02-03 4 views
11

Sono presenti istanze del modello di evento che possono appartenere a una o più istanze del modello di organizzazione. Ho implementato haystack 2.0.0 per indicizzare tutti i miei eventi. Ecco un indice di ricerca di esempio.Django Haystack: filtra la query in base a più elementi in un elenco.

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

La mia domanda è come faccio a creare una query SearchQuerySet che filtra eventi in base a una o più organizzazioni. Ad esempio, io voglio trovare tutti gli eventi che appartengono al "orgnization1" e "organization3" (dove l'elenco delle organizzazioni può essere di qualsiasi lunghezza lungo)

Come Django interrogare potrebbe essere simile a questa:

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

Come si traduce in una query sul pagliaio? Questo è il mio tentativo, ma io non so davvero cosa sto facendo ...

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

Ecco un esempio di come i miei modelli guardano:

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

Ogni aiuto è molto apprezzato.

risposta

18

Penso di aver trovato una soluzione. Semplicemente condividendolo Apparentemente, Haystack ha un oggetto chiamato SQ(), che funziona come l'oggetto Q() di Django. Ho trovato da qualche parte che puoi invocare il metodo add() sulle istanze degli oggetti Q di Django per aggiungere più parametri di query. Sembra funzionare allo stesso modo con 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

Mi rendo conto che questo è abbastanza vecchia, ma si può .filter (organization_slug__in = organization_list) – Nagyman

+0

codice Nizza: D, grazie –