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