使用django对postgres ArrayField进行不区分大小写的搜索

noɥ*_*ɐɹƆ 7 python database django postgresql

在ArrayField的Django文档中,它列出了一个contains字段查找.但是,icontainsArrayField中不存在(不区分大小写的查找 - 许多其他字段都有)查找.

我需要一个对ArrayField不区分大小写的查找函数,类似于预先存在的contains查找.

Ste*_*ula 5

您可以使用进行大小写不敏感的查询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'。这与上面提到的字符串转换有关。使用风险自负。


Dhi*_*aTN 4

icontainsiexact仅适用于字符串类型:

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