Поиск без учета регистра на Postgres ArrayField с django
в документации Django для ArrayField, он перечисляет contains
поиска поля. Однако нет icontains
(поиск без учета регистра - многие другие поля имеют его) поиск присутствует в ArrayField.
мне нужна функция поиска без учета регистра для ArrayField, аналогичная существующей contains
поиск.
2 ответов
icontains
, iexact
применяются только к строковому типу:
my_array_field__contains=['H']
проверьте, является ли ['H']входит в my_array_field
но если вы попробуете следующее, он будет работать:
my_array_field__0__icontains='H'
потому что он проверяет, если первый элемент содержит H или H
вы можете сделать нечувствительный к регистру поиск с помощью 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.