noɥ*_*ɐɹƆ 7 python database django postgresql
在ArrayField的Django文档中,它列出了一个contains
字段查找.但是,icontains
ArrayField中不存在(不区分大小写的查找 - 许多其他字段都有)查找.
我需要一个对ArrayField不区分大小写的查找函数,类似于预先存在的contains
查找.
您可以使用进行大小写不敏感的查询icontains
,方法是省略用于方括号的内容contains
:
queryset = my_model.objects.filter(field_name__icontains='my_substring')
Run Code Online (Sandbox Code Playgroud)
之所以可行,是因为Postgres将ArrayField转换为文本,然后检查“ my_substring”作为数组文本表示形式的子字符串。您可以通过检查结果查询来查看此内容:
print(queryset.query)
# raw SQL output:
'SELECT ... WHERE UPPER("my_model"."field_name"::text) LIKE UPPER(%my_substring%)
Run Code Online (Sandbox Code Playgroud)
这在Postgres 10.1中为我工作。
作为附录,我应该披露此方法导致了我的项目的错误。假设您要检查数组字段是否包含'my_substring'
:
field_name__icontains='my_substring'
Run Code Online (Sandbox Code Playgroud)
这将检索'my_substring'
,但也将检索'foo_my_substring'
。这与上面提到的字符串转换有关。使用风险自负。
icontains
,iexact
仅适用于字符串类型:
my_array_field__contains=['H']
Run Code Online (Sandbox Code Playgroud)
检查 ['H'] 是否包含在 my_array_field 中
但如果您尝试以下操作,它将起作用:
my_array_field__0__icontains='H'
Run Code Online (Sandbox Code Playgroud)
因为它检查第一个元素是否包含H 或 h