Как фильтровать кверисет по строковому полю, содержащему json (Django + SQLite)
У меня следующая ситуация. В модели полета (рейсы) есть поле 'airlines_codes' (TextField), в котором я храню данные в массиве JSON в формате:
["TB", "IR", "EP", "XX"]
Мне нужно отфильтровать рейсы по 2-буквенному коду авиакомпании (формат IATA), например, 'XX', и я добиваюсь этого примитивно, но успешно следующим образом:
filtered_flights = Flight.objects.filter(airlines_codes__in='XX')
Это здорово, но на самом деле нет. У меня есть рейсы, где airlines_codes выглядят следующим образом:
["TBZ", "IR", "EP", "XXY"]
Здесь присутствуют 3-буквенные коды (формат ICAO) и, очевидно, фильтр запроса выше не будет работать.
PS. Я не могу перейти на PostgreSQL, также я не могу каким-либо образом изменить базу данных. Это должно быть достигнуто только с помощью некоторого запроса.
Спасибо за любую идею.
Не изменяя базу данных каким-либо образом, вам нужно отфильтровать значение в виде строки. Лучшим вариантом может быть airlines_codes__contains. Вот что я бы рекомендовал, предполагая, что ваш список всегда будет очищаться именно так, как вы его представляете.
Flight.objects.filter(airlines_codes__contains='"XX"')
В версии Django 3.1 JSONField поддерживается более широкий набор баз данных. В идеале, для кого-то другого, создающего подобную систему с нуля, это поле будет предпочтительным подходом.