#django #elasticsearch #django-haystack
#django #elasticsearch #django-haystack
Вопрос:
По большей части мой поиск работает так, как мне нужно, но я хотел бы иметь возможность сортировать по категориям, которые выбирает пользователь.
Я подклассировал searchForm
, чтобы содержать:
def no_query_found(self):
"""
Determines the behavior when no query was found.
By default, no results are returned (``EmptySearchQuerySet``).
Should you want to show all results, override this method in your
own ``SearchForm`` subclass and do ``return self.searchqueryset.all()``.
"""
return self.searchqueryset.models(Idea)
def search(self):
sqs = super(IdeaCategories, self).search()
if not self.is_valid():
return self.no_query_found()
if self.cleaned_data['category']:
sqs = sqs.filter(tags__contains=self.cleaned_data['category'])
return sqs
Следующее работает так, как ожидалось:
/testing/search/?q=test
-> Все результаты, связанные с «test»
/testing/search/?category=Developmentamp;q=
-> Все результаты, относящиеся к «разработке»
/testing/search/?category=Developmentamp;q=book
-> Все результаты, относящиеся к «разработке» и содержащие «книгу»
Единственное, чего я не могу понять, это как заставить его правильно выполнять поиск по категориям из 2 или более:
/testing/search/?category=Developmentamp;category=Supplemental Materialamp;q=
Есть ли способ получить список категорий, запрос и фильтр для объединенных результатов? Такие , как:
sqs = sqs.filter(tags__contains["Development", "Supplemental Material"])
Ответ №1:
Хорошо! Итак, теперь я с этим разобрался.
Внутри моего класса SearchForm:
Я создал список вариантов из базы данных для использования в форме.
choices_group = tuple(
[(choice, choice) for choice in
Category.objects.values_list('label', flat=True)])
Примените эти варианты к моей форме.
sort = forms.MultipleChoiceField(choices=choices_group, widget=forms.CheckboxSelectMultiple)
Создал свой набор запросов.
q_sorted = self.cleaned_data['sort']
if q_sorted:
sqs = sqs.filter(tags__in=q_sorted)
Наконец, в моем шаблоне.
{{form.sort}}