python - 在 Django Model 数据库函数中使用 Unaccent

标签 python django

我在 Postgres 中安装了 unaccent 扩展,并且简单的过滤器在我的 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)))

我看过这个答案: How use `unaccent` with full text search in django 1.10?但感觉不需要那样。

最佳答案

经过额外的挖掘,我能够做到这一点:

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"

关于python - 在 Django Model 数据库函数中使用 Unaccent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603507/

相关文章:

python - 将文件打开到数组中,搜索字符串并返回值

Python 在对列表中的数字进行排序时忽略零

python - Django:将 "NULLS LAST"添加到查询

django - 由于 egg_info 错误,无法通过 pip 安装

django - 如何使用 Django 中的函数过滤查询集?

python - 如何按照某些标准将数据集拆分为子集?

javascript - 使用 CustomJS 过滤数据帧和绘图的 Bokeh 选择小部件回调

Django Querysets - 按相关对象中的 bool 值过滤对象

python - 如果我将 2 个 float 相乘,结果是否可能与 2 个小数相乘的结果不同?

django - 在由 Rest Framework 引起的 Django 500 错误中显示 request.DATA