Django 3.1 introduces PostgreSQL
search_type="websearch" - which gives you search with advanced operators like
"phrase search" -excluding. James Turk wrote about this here, and it's also in my weeknotes.
I decided to add it to my Django Admin interface. It was really easy using the
get_search_results() model admin method, documented here.
My models already have a
search_document full-text search column, as described in Implementing faceted search with Django and PostgreSQL. So all I needed to add to my
ModelAdmin subclasses was this:
def get_search_results(self, request, queryset, search_term): if not search_term: return super().get_search_results( request, queryset, search_term ) query = SearchQuery(search_term, search_type="websearch") rank = SearchRank(F("search_document"), query) queryset = ( queryset .annotate(rank=rank) .filter(search_document=query) .order_by("-rank") ) return queryset, False
Here's the full implementation for my personal blog.
Created 2020-07-25T15:36:17-07:00 · Edit