2012-02-03 11 views
11

Tengo instancias de modelo de evento que pueden pertenecer a una o más instancias de modelo de organización. Implementé haystack 2.0.0 para indexar todos mis eventos. Aquí hay un índice de búsqueda de ejemplo.Django Haystack: consulta de filtro basada en varios elementos de una lista.

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

Mi pregunta es ¿cómo construir una consulta que filtra SearchQuerySet Eventos en base a una o varias organizaciones. Por ejemplo, quiero encontrar todos los eventos que pertenecen a "orgnization1" y "organización3" (donde la lista de organizaciones puede ser de cualquier longitud larga)

Como Django consulta podría ser algo como esto:

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

¿Cómo puedo traducir esto a una consulta de pajar? Este es mi intento, pero no se sabe muy bien lo que estoy haciendo ...

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

Aquí es un ejemplo de cómo se ven mis modelos:

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

Cualquier ayuda es muy apreciada.

Respuesta

18

Creo que he encontrado una solución. Solo compartirlo. Aparentemente, Haystack tiene un objeto llamado SQ(), que funciona de forma similar al objeto Q() de Django. Encontré en algún lugar que puede invocar el método add() en las instancias de objeto Q de Django para agregar más parámetros de consulta. Parece que funciona de la misma manera 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

me di cuenta que es bastante antiguo, pero se puede .Filter (organization_slug__in = organization_list) – Nagyman

+0

código de Niza: D, gracias –

Cuestiones relacionadas