Список фильтров в 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) возможен при неправильном использовании реляционной структуры.

Лучший подход здесь:

  1. Создайте новую модель, которая описывает вашу сущность atc_code. Например, AtcCode
  2. .
  3. В зависимости от значения atc_code и его отношения к MainEnity используйте ForeignKeyField или ManyToManyField
  4. .

Используйте все плюсы реляционной базы данных и мощный Django ORM с такими встроенными функциями как фильтрация, добавление, удаление, запрос с любым бэкендом базы данных.

Это будет работать на любой поддерживаемой базе данных. Реляционная база данных будет работать быстрее, если вы правильно используете отношения.

Моя рекомендация - использовать JSONField, когда у вас действительно неструктурированный объект.

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