Поиск без учета регистра на 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.