Django Haystack: фильтровать запросы на основе нескольких элементов в списке. - PullRequest
11 голосов
/ 03 февраля 2012

У меня есть экземпляры модели событий, которые могут принадлежать одному или нескольким экземплярам модели организации. Я реализовал стог сена 2.0.0 для индексации всех моих событий. Вот пример поискового индекса.

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

Любая помощь очень ценится.

1 Ответ

19 голосов
/ 06 февраля 2012

Я думаю, что нашел решение. Просто делюсь этим. По-видимому, в Haystack есть объект, называемый SQ (), который функционирует подобно объекту Django Q (). Я нашел где-то, что вы можете вызывать метод add () для экземпляров объекта D в Django, чтобы добавить больше параметров запроса. Кажется, работает так же с 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()
...