postgresql 使用django的postgres ArrayField上不区分大小写的搜索

qkf9rpyu  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(100)

在Django的ArrayField文档中,它列出了一个contains字段查找。但是,ArrayField中没有icontains(不区分大小写的查找-许多其他字段都有)查找。
我需要一个不区分大小写的ArrayField查找函数,类似于预先存在的contains查找。

yquaqz18

yquaqz181#

**警告:**这是一个黑客,导致我自己的应用程序中的一个错误。使用风险自担。

您可以使用icontains进行不区分大小写的查找,方法是省略用于contains的方括号:

queryset = my_model.objects.filter(field_name__icontains='my_substring')

这是因为Postgres将ArrayField转换为文本,然后检查'my_substring'作为数组文本表示的子字符串。您可以通过检查结果查询来看到这一点:

print(queryset.query)

# raw SQL output:
'SELECT ... WHERE UPPER("my_model"."field_name"::text) LIKE UPPER(%my_substring%)

这在Postgres 10中很有用。1.

附录/bug

这种方法给我的项目带来了一个bug。假设你想检查数组字段是否包含'my_substring'

field_name__icontains='my_substring'

这将检索'my_substring',但也将检索'foo_my_substring'。这与上面提到的弦铸造有关。使用风险自担。

gab6jxml

gab6jxml2#

icontainsiexact仅适用于字符串类型:

my_array_field__contains=['H']

检查['H']是否包含在my_array_field中
但如果你尝试以下方法,它会起作用:

my_array_field__0__icontains='H'

因为它检查第一个元素是否包含H或h

4nkexdtk

4nkexdtk3#

你可以像这样查询大小写不敏感的数组:

select 'tartu' ILIKE ANY (array['Tallinn', 'Tartu','Narva']);

在Django中:

MyModel.objects.extra(
    where=['%s ILIKE ANY (array_column_name)'],
    params=['tartu', ]
)

相关问题