2012-02-03 22 views
11

Bir veya daha fazla Organizasyon model örneğine ait olabilmek için Event model örneklerim var. Tüm Etkinliklerimi dizine eklemek için haystack 2.0.0 kullanıyorum. İşte bir örnek arama dizini.Django Haystack: bir listedeki birden çok öğeye dayalı filtre sorgusu.

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

sorum ben bir veya birkaç Kuruluşları dayalı Olaylar filtreleyen bir SearchQuerySet sorgusu oluşturmak nasıl olduğunu. Örneğin, ben gibi

(kuruluşların listesi uzun herhangi bir uzunlukta olabileceği) için "orgnization1" ve "organization3" ait olan tüm Olayları bulmak istiyoruz Django böyle görünebilir sorgulamak a:

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

Bunu bir samanlık sorgusuna nasıl çeviririm? Herhangi bir yardım çok takdir edilir

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

: Burada

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

mankenlerim nasıl göründüğü ile ilgili bir örnek ... Bu benim girişimi, ama gerçekten ben ne yaptığımı bilmiyorum.

cevap

18

Sanırım bir çözüm buldum. Sadece paylaşıyorum. Görünüşe göre, Haystack'ın Django'nun Q() nesnesine benzeyen SQ() adında bir nesnesi var. Daha fazla sorgu parametresi eklemek için Django'nun Q nesne örneklerinde add() yöntemini çağırabileceğiniz bir yer buldum. SQ ile aynı şekilde çalışır gibi görünüyor.

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

Bu oldukça eski olduğunu biliyorum ama sen .filter olabilir (organization_slug__in = organization_list) – Nagyman

+0

Güzel kodu: D teşekkürler –