Список фильтров в Django JSON Поле со строкой содержит
Мое поле Django JSON содержит список значений типа ["N05BB01", "R06AX33"].
atc_code = JSONField(default=list())
Я хотел бы отфильтровать это поле, для 'содержит ли какая-либо строка в списке "N05"?'.
Это должно работать:
contains_string = [code for code in atc_code if 'N05' in code]
В этом случае, если вы не используете SQLite
или Oracle
, вы можете использовать contains
:
mymodel.objects.filter(atc_code__contains='N05')
Что генерирует этот SQL:
SELECT * FROM "mymodel" WHERE UPPER("mymodel"."atc_code"::text) LIKE UPPER(%N05%)
Ответ на основе реляций
Обычно такой подход (со списком значений в JSONField) возможен при неправильном использовании реляционной структуры.
Лучший подход здесь:
- Создайте новую модель, которая описывает вашу сущность
atc_code
. Например,AtcCode
.
- В зависимости от значения atc_code и его отношения к
MainEnity
используйте ForeignKeyField или ManyToManyField .
Используйте все плюсы реляционной базы данных и мощный Django ORM с такими встроенными функциями как фильтрация, добавление, удаление, запрос с любым бэкендом базы данных.
Это будет работать на любой поддерживаемой базе данных. Реляционная база данных будет работать быстрее, если вы правильно используете отношения.
Моя рекомендация - использовать JSONField, когда у вас действительно неструктурированный объект.