Использование Unaccent в Django Функция базы данных модели - PullRequest
1 голос
/ 05 января 2020

У меня установлено unaccent расширение, установленное в Postgres, и в моем приложении Django работают простые фильтры, например:

q = 'hello'
queryset.filter(name__unaccent__startswith=q)

Я сейчас пытаюсь комментировать результат набора запросов с поисковым индексом:

queryset.annotate(search_index=StrIndex(Lower('name'), Value(q)))

Это прекрасно работает для текста без акцента, но я пытаюсь найти способ применить UNACCENT к переменной name. По сути:

SELECT
  -- This is what I want!
  STRPOS(LOWER(UNACCENT(core_ingredient.name)::text), 'hello') AS search_index_unaccented,
  STRPOS(LOWER(core_ingredient.name), 'hello') AS search_index_basic
FROM
  -- ...

Я пробовал:

# This has no effect, gives same query / result as above
queryset.annotate(search_index=StrIndex(Lower('name__unaccent'), Value(q)))

Я видел этот ответ: Как использовать `unaccent` с полнотекстовым поиском в django 1.10? но чувствую, что это не нужно.

1 Ответ

0 голосов
/ 05 января 2020

После дополнительного копания я смог просто сделать это:

from django.contrib.postgres.lookups import Unaccent

queryset.annotate(search_index=StrIndex(Unaccent(Lower('name')), Value(q)))

Не похоже, хорошо документировано в Django, но работает как ожидалось с SQL:

STRPOS(UNACCENT(LOWER("core_ingredient"."name")), 'hello') AS "search_index"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...