@aabce

Как на Django/DRF сделать поиск слов с неполным соответсвием или ошибками?

Всем привет! Необходимо реализовать поиск\фильтрацию моделей продуктов по полю наименование

class Product( models.Model ):
    title           = models.CharField( max_length=250, blank=True, null=True ) #Happy cake
    description     = models.TextField( blank=False )
    user            = models.ForeignKey( settings.AUTH_USER_MODEL, related_name='product', on_delete=models.CASCADE )
    img             = models.ImageField( upload_to='products', blank=True, null=True )

    def __str__( self ):
        return str( self.title )

    def get_api_url( self, request=None ):
        return reverse( 'markets:product-detail', kwargs={ 'pk': self.pk  }, request=request )

Тоесть если запросом придет слово happy cace или happi cake мне всеравно выдаст модель с наименованием Happy cake.Возможно ли это реализовать средствами Django\Drf или необходимо обратиться к иным технологиям?

PS. Был такой вариант

Model.objects.filter(title__in=['happy cake', 'happi kake'])

Но записывать каждое возможное значение это как мне кажется глупо
  • Вопрос задан
  • 937 просмотров
Пригласить эксперта
Ответы на вопрос 1
@marazmiki
Укротитель питонов
Именно средствами Django вряд ли получится, ибо ни DRF, ни Django сами не занимаются каким-либо поиском и\или фильтрацией; они лишь предоставляют единый интерфейс к средствам хранения и поиска (ака базам данных). А вот некоторые базы данных вполне умеют в полнотекстовый поиск. В частности, так умеют делать популярные среди джанго-разработчиков PostgreSQL и MySQL.

С Постгресом всё относительно просто: поиск работает практически из коробки, достаточно лишь использовать django.contrib.postgres.

Для MySQL придётся воспользоваться raw-кверисетами или написать собственный lookup, который бы генерировал нужный запрос к базе данных, но тоже проблем нет.

Резюме такое: сделать полнотекст, не прибегая к сторонним решениям, чаще всего можно. Но и про сторонние решения, типа Elasticsearch, забывать не стоит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы