在Django的ArrayField文档中,它列出了一个contains字段查找。但是,ArrayField中没有icontains(不区分大小写的查找-许多其他字段都有)查找。我需要一个不区分大小写的ArrayField查找函数,类似于预先存在的contains查找。
contains
icontains
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':
'my_substring'
field_name__icontains='my_substring'
这将检索'my_substring',但也将检索'foo_my_substring'。这与上面提到的弦铸造有关。使用风险自担。
'foo_my_substring'
gab6jxml2#
icontains,iexact仅适用于字符串类型:
iexact
my_array_field__contains=['H']
检查['H']是否包含在my_array_field中但如果你尝试以下方法,它会起作用:
my_array_field__0__icontains='H'
因为它检查第一个元素是否包含H或h
4nkexdtk3#
你可以像这样查询大小写不敏感的数组:
select 'tartu' ILIKE ANY (array['Tallinn', 'Tartu','Narva']);
在Django中:
MyModel.objects.extra( where=['%s ILIKE ANY (array_column_name)'], params=['tartu', ] )
3条答案
按热度按时间yquaqz181#
**警告:**这是一个黑客,导致我自己的应用程序中的一个错误。使用风险自担。
您可以使用
icontains
进行不区分大小写的查找,方法是省略用于contains
的方括号:这是因为Postgres将ArrayField转换为文本,然后检查'my_substring'作为数组文本表示的子字符串。您可以通过检查结果查询来看到这一点:
这在Postgres 10中很有用。1.
附录/bug
这种方法给我的项目带来了一个bug。假设你想检查数组字段是否包含
'my_substring'
:这将检索
'my_substring'
,但也将检索'foo_my_substring'
。这与上面提到的弦铸造有关。使用风险自担。gab6jxml2#
icontains
,iexact
仅适用于字符串类型:检查['H']是否包含在my_array_field中
但如果你尝试以下方法,它会起作用:
因为它检查第一个元素是否包含H或h
4nkexdtk3#
你可以像这样查询大小写不敏感的数组:
在Django中: