Django: фильтровать JSONField с несколькими вложенными массивами

У меня есть JSONField с именем metadata в моей модели в Django.

Данные в этих полях могут выглядеть примерно так

{
    "vis": {
        "plots": [
            // some objects here
            {
                "id": 1,
                "x": "foo",
                "y": "bar",
                "externalData": [
                    // some objects here
                    {
                        "x": "fa",
                        "y": "so",
                        "source": {
                            "name": "FINDME",
                            "location": "some other address"
                        }
                    },
                    // some more objects here
                ]
            },
            // some more objects here
        ],
        "somethingElse": []
    },
    "moreStuff": {}
}

Я хочу иметь возможность фильтровать модели, которые имеют "name": "FINDME" в объекте externalData (по любому индексу), внутри объекта plots (также по любому индексу).

я изначально пытался

MyModel.objects.filter(metadata__vis__plots__externalData__source__name='FINDME')

Не хорошо. Затем я попытался

MyModel.objects.filter(metadata__vis__plots__externalData__source__contains={'name':'FINDME'})

Не хорошо. Затем я попытался

MyModel.objects.filter(metadata__vis__plots__externalData__contains=[{'source': {'name':'FINDME'}}])

Все равно не повезло. Наконец, я попытался

MyModel.objects.filter(metadata__vis__plots__contains=[{'externalData':[{'source': {'name': 'FINDME'}}]}])

До сих пор нет хитов.

Очевидно, я делаю все это неправильно.

Есть идеи?

РЕДАКТИРОВАТЬ: я добавил несколько комментариев в JSON, чтобы было ясно, что у меня есть не только один объект в каждом из моих массивов. Я пытаюсь найти «сюжет» по произвольному индексу и «внешние данные» по произвольному индексу, который содержит этот "source": {"name": "FINDME"}.


person freethebees    schedule 24.05.2018    source источник
comment
Я думаю, что это может помочь использовать stackoverflow.com/ вопросы/34358278/   -  person Andrey Berenda    schedule 24.05.2018
comment
Мои первые попытки появились после прочтения этой страницы. Моя проблема заключается в том, чтобы соответствовать любому индексу. Кажется, я не могу обработать свой запрос, чтобы это сработало.   -  person freethebees    schedule 25.05.2018


Ответы (1)


Структура вашего содержимого должна соответствовать JSON, начиная с первого массива. Каждый уровень массива в вашем JSON должен быть представлен в contains=

Легче показать, чем сказать. Так:

MyModel.objects.filter(
     metadata__vis__plots__contains=[{'externalData': [{'source': {'name': 'FINDME'}}]}]
)
person Georg Zimmer    schedule 29.01.2019
comment
Есть ли способ вести себя как оператор LIKE? (т. е. поиск 'FIND' также будет соответствовать 'FINDME') - person antonzy; 04.02.2019
comment
Я не нашел ответа на это. Кажется, что это должно быть возможно, но я не могу понять, как это сделать. - person Georg Zimmer; 09.04.2019