Поиск Django по значению массива JSONFieldPython

Программы на Python
Anonymous
Поиск Django по значению массива JSONField

Сообщение Anonymous »

Предположим, у меня есть записи базы данных MySQL с такой структурой:

Код: Выделить всё

{
"id": 44207,
"actors": [
{
"id": "9c88bd9c-f41b-59fa-bfb6-427b1755ea64",
"name": "APT41",
"scope": "confirmed"
},
{
"id": "6f82bd9c-f31b-59fa-bf26-427b1355ea64",
"name": "APT67",
"scope": "confirmed"
}
],
},
{
"id": 44208,
"actors": [
{
"id": "427b1355ea64-bfb6-59fa-bfb6-427b1755ea64",
"name": "APT21",
"scope": "confirmed"
},
{
"id": "9c88bd9c-f31b-59fa-bf26-427b1355ea64",
"name": "APT22",
"scope": "confirmed"
}
],
},
...
— это поле JSON.
Как я могу отфильтровать все объекты, имя актеров которых содержит, например, «67»?
Самый близкий вариант, который у меня есть, — это то, что он работает следующим образом:

Код: Выделить всё

queryset.filter(actors__contains=[{"name":"APT67"}])
Но этот запрос соответствует точному значению act.name, а я хочу использовать оператор contains.
У меня также есть он, работающий путем запроса со строгим индексом массива, например:

Код: Выделить всё

queryset.filter(actors__0__name__icontains='67')
Но он соответствует только в том случае, если первый элемент массива соответствует моему запросу. И мне нужно, чтобы этот объект возвращался в любом из его актеров, соответствующих моему запросу, поэтому я ожидал, что что-то вроде queryset.filter(actors__name__icontains='67') будет работать, но это не работает :(
Пока мне приходится использовать models.Q и несколько OR для поддержки моих потребностей, вот так -

Код: Выделить всё

search_query = models.Q(actors__0__name__icontains='67') | models.Q(actors__1__name__icontains='67') | models.Q(actors__2__name__icontains='67') | models.Q(actors__3__name__icontains='67')
queryset.filter(search_query)
но это выглядит ужасно и поддерживает поиск только по 4 элементам (или мне придется включить больше OR).
Есть какие-нибудь подсказки, можно ли в целом решить эту проблему обычным способом?>

Вернуться в «Python»