django icontains для поиска в базе данных postgres - PullRequest
0 голосов
/ 29 сентября 2018

В настоящее время у меня есть приложение Django и база данных postgres.Я хочу иметь панель поиска, которая позволяет пользователям вводить значение, и она будет искать в некоторых полях модели для поиска совпадающих значений.Я хочу, чтобы это работало даже для значений "".В настоящее время у меня есть:

MyModel.objects.filter(myfield__icontains=search_query).order_by(...)

Как бы я сделать это, чтобы он мог искать несколько полей модели одновременно.Какой самый эффективный способ сделать это?"Icontains" хорошо для этого?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Делать это с помощью регулярных запросов к фильтру и icontains не рекомендуется, поскольку это довольно быстро становится неэффективным - вы, конечно, не хотите делать это с несколькими большими текстовыми полями.

Однако PostgreSQL поставляется с полнотекстовой поисковой системой , которая предназначена именно для этой цели.Django обеспечивает поддержку для этого .

. Вы можете определить SearchVector для выполнения полнотекстового поиска сразу по нескольким полям, например:

from django.contrib.postgres.search import SearchVector

MyModel.objects.annotate(
    search=SearchVector('field_1') + SearchVector('field_2'),
).filter(search='search_query')

Документация, на которую я ссылался, содержит много дополнительной информации о том, как выполнять ранжирование и т. Д. В результатах поиска.

Другой альтернативой является использование поисковой системы, такой как Elasticsearch - необходимость этого зависит отот того, сколько объектов у вас есть и какую фильтрацию и ранжирование вам нужно выполнить по результатам.

0 голосов
/ 29 сентября 2018

Вы можете использовать Q для поиска по нескольким полям, например:

полей, которые вы хотите найти:

field0
field1
field2

Код поиска Django:

from django.db.models import Q

search_result = MyModel.objects.filter(
    Q(field0_icontains=search_query) |
    Q(field1_icontains=search_query) |
    Q(field2_icontains=search_query)
).order_by(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...