Gerando SearchQuerySet com vários operadores booleanos no Haystack

Por padrão, Haystack fornece algumas maneiras de fazer SearchQuerySet fora da string de consulta. Você pode usar o método filter () básico, mas ele suporta apenas um operador booleano padrão por vez. Ou você pode usar raw_search (), que não se integra bem com outras coisas (especialmente em ModelSearch). Ou você pode codificar sua consulta.

Ou você pode criar seu próprio formulário e colocar estes dois métodos nele:

def search(self):
if not self.is_valid():
return self.no_query_found()

if not self.cleaned_data.get('q'):
return self.no_query_found()

sqs
= self._parse_query(self.cleaned_data['q'])

if self.load_all:
sqs
= sqs.load_all()

return sqs

def _parse_query(self, query_content):
words
= iter(query_content.split())
result_queryset
= self.searchqueryset
for word in words:
try:
if word == 'AND':
result_queryset
= result_queryset.filter_and(
content
=words.next())
elif word == 'OR':
result_queryset
= result_queryset.filter_or(
content
=words.next())
elif word == 'NOT':
result_queryset
= result_queryset.exclude(
content
=words.next())
else:
result_queryset
= result_queryset.filter(
content
=word)
except StopIteration:
return result_queryset
return result_queryset