Как фильтровать кверисет по строковому полю, содержащему 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 поддерживается более широкий набор баз данных. В идеале, для кого-то другого, создающего подобную систему с нуля, это поле будет предпочтительным подходом.

Вернуться на верх