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