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

标签 django django-jsonfield

我在 Django 的模型上有一个 JSONField,称为 metadata

该字段中的数据可能看起来像这样

{
    "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": {}
}

我希望能够过滤在 externalData 对象(在任何索引处)、 绘图中具有 "name": "FINDME" 的模型 对象(也在任何索引处)。

我最初尝试过

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"} 的任意索引处找到一个“externalData”。

最佳答案

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

中表示

说比说容易。像这样:

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

关于Django:使用多个嵌套数组过滤 JSONField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50513541/

相关文章:

django postgres JSONField |查询以 checkin 值列表(包含)

python - django.db.utils.ProgrammingError : cannot cast type text[] to jsonb

django - 启动 django 服务器时,我不断收到 NotImplementedError 错误

Django Order_by 空白

python - 将自定义模块导入 Django

python - 将 django 升级到 1.6.5 后出现 django object is not JSON serializable 错误

python - Django - 存储过程不存在

python - Google App Engine 上的 2 个不同的 Django 模块

python - Django JsonField 到表单