Django文档中的ArrayField列出了一个contains
字段查找。然而,ArrayField中没有icontains
(不区分大小写查找 - 许多其他字段都有)查找。
我需要一个类似于现有contains
查找的ArrayField不区分大小写的查找函数。
Django文档中的ArrayField列出了一个contains
字段查找。然而,ArrayField中没有icontains
(不区分大小写查找 - 许多其他字段都有)查找。
我需要一个类似于现有contains
查找的ArrayField不区分大小写的查找函数。
警告:这是一种黑客行为,可能会导致我的应用程序出现错误。请自行承担风险。
您可以使用 icontains
进行不区分大小写的查找,只需省略您用于 contains
的方括号:
queryset = my_model.objects.filter(field_name__icontains='my_substring')
print(queryset.query)
# raw SQL output:
'SELECT ... WHERE UPPER("my_model"."field_name"::text) LIKE UPPER(%my_substring%)
这在我的Postgres 10.1中有效。
附录/错误
这种方法在我的项目中引起了一个错误。比如你想检查数组字段是否包含'my_substring'
:
field_name__icontains='my_substring'
这将检索'my_substring'
,但它也将检索'foo_my_substring'
。这与上面提到的字符串转换有关。使用时请自行决定风险。
icontains
和iexact
仅适用于字符串类型:
my_array_field__contains=['H']
my_array_field__0__icontains='H'
select 'tartu' ILIKE ANY (array['Tallinn', 'Tartu','Narva']);
MyModel.objects.extra(
where=['%s ILIKE ANY (array_column_name)'],
params=['tartu', ]
)