Django:使用多个嵌套数组过滤JSONField

时间:2018-05-24 15:54:28

标签: django django-jsonfield

我在Django的模型中有一个名为metadata的JSONField。

该字段中的数据可能类似于此

{
    "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中添加了一些注释,以明确我的每个数组中不仅有一个对象。我试图找到任意索引的'plot'和包含"source": {"name": "FINDME"}的任意索引的'externalData'。

1 个答案:

答案 0 :(得分:0)

容器的结构需要匹配JSON,从第一个数组开始。 JSON中的每个数组级别都需要用contains =

表示

显示比说起来容易。像这样:

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