Запрос поиска в стоге сена с несколькими параметрами URL

#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}}