[docs]defnormalize_query(query_string,findterms=re.compile(r'"([^"]+)"|(\S+)').findall,normspace=re.compile(r"\s{2,}").sub):"""Splits the query string in individual keywords, getting rid of unnecessary spaces and grouping quoted words together. Example: >>> normalize_query(' some random words "with quotes " and spaces') ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] """return[normspace(" ",(t[0]ort[1]).strip())fortinfindterms(query_string)]
[docs]defget_query(query_string,search_fields):"""Returns a query, that is a combination of Q objects. That combination aims to search keywords within a model by testing the given search fields. """query=None# Query to search for every search termterms=normalize_query(query_string)forterminterms:or_query=None# Query to search for a given term in each fieldforfield_nameinsearch_fields:q=Q(**{"%s__icontains"%field_name:term})ifor_queryisNone:or_query=qelse:or_query=or_query|qifqueryisNone:query=or_queryelse:query=query&or_queryreturnquery