【问题标题】:Case-insensitive search on a postgres ArrayField with django使用 django 对 postgres ArrayField 进行不区分大小写的搜索
【发布时间】:2015-12-28 02:29:57
【问题描述】:
【问题讨论】:
标签:
python
django
database
postgresql
【解决方案1】:
您可以使用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 中对我有用。
作为附录,我应该披露这种方法导致我的项目出现错误。假设您要检查数组字段是否包含'my_substring':
field_name__icontains='my_substring'
这将检索'my_substring',但它也会检索'foo_my_substring'。这与上面提到的字符串转换有关。使用风险自负。
【解决方案2】:
icontains、iexact 仅适用于字符串类型:
my_array_field__contains=['H']
检查 ['H'] 是否在 my_array_field 中包含
但如果你尝试以下方法,它会起作用:
my_array_field__0__icontains='H'
因为它检查第一个元素是否包含 H 或 h
【解决方案3】:
您可以像这样查询不区分大小写的数组搜索:
select 'tartu' ILIKE ANY (array['Tallinn', 'Tartu','Narva']);
在 Django 中:
MyModel.objects.extra(
where=['%s ILIKE ANY (array_column_name)'],
params=['tartu', ]
)