Фильтр по массиву 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')
)

Вот ссылка на официальную документацию.

Другие вопросы по тегам