У постгреса есть поиск по триграммам, у триграмм есть similarity (по которой можно сортировать и фильтровать). В джанге (кажется, начиная с 1.10) есть привязки для этого всего —
https://docs.djangoproject.com/en/2.0/ref/contrib/...
Нужно в БД установить pg_trgm; (
которое тоже есть в джанге, но для этого юзер БД джанги должен быть суперюзером)
Можно сделать GiN индекс по триграмме, что ускорит выполнение __icontains.
Пример поиска можно посмотреть здесь:
https://ukar.su/
Делал ребятам поиск как раз на триграммах. Но там он чуть умнее — умеет понимать ошибочную раскладку. Можешь поискать, например, "Thermaflex". Вводишь Thermaflix, thermoflex, еукьщадулы, термафлекс, термосфрекс, nthvjaktrc, флекстермо — всё равно находит