Фильтр по массиву JSONField
У меня есть книжная модель
class Book():
...
tags=JSONField()
У меня есть несколько записей:
Book(..., tags=['TECH', 'BUSINESS'])
Book(..., tags=['MARKETING'])
Я хочу отфильтровать книги с тегом "Технология" или "Бизнес"
query = Q (
Q(tags__contains='Tech') |
Q(tags__contains='Business')
)
Я пытался использовать Содержит, contains_by, has_key, has_any_keys, но не получилось. Результат всегда пуст.
Обновить
Это была моя ошибка! Я обнаружил проблему, JSONField чувствителен к регистру.
Значения, сохраненные в БД, были ["TECH", "BUSINESS"]
вместо ["Tech", "Business"]
,
Теперь вопрос получается How to search in a case-insensitive manner?
2 ответа
Я ответил на ваш вопрос о репозитории Django-MySQL: https://github.com/adamchainz/django-mysql/issues/401. По сути, кажется, что этого нельзя сделать, поскольку значения MySQL JSON чувствительны только к регистру, как указано в https://dev.mysql.com/doc/refman/5.7/en/json.html
Поиск без учета регистра может быть выполнен с icontains
:
query = Q(
Q(tags__icontains='tech') |
Q(tags__icontains='business')
)
Вот ссылка на официальную документацию.