【问题标题】:Django: filter JSONField with multiple nested arraysDjango:使用多个嵌套数组过滤 JSONField
【发布时间】:2018-05-24 15:54:28
【问题描述】:

我在 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 中添加了一些 cmets,以明确我的每个数组中不仅有一个对象。我正在尝试在任意索引处查找“情节”,在包含"source": {"name": "FINDME"} 的任意索引处查找“externalData”。

【问题讨论】:

  • 我认为它可以帮助使用stackoverflow.com/questions/34358278/…
  • 我最初的尝试是在阅读该页面后进行的。我的问题是匹配 any 索引。我似乎无法解决我的查询以使其发挥作用。

标签: django django-jsonfield


【解决方案1】:

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

展示比说容易。像这样:

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

【讨论】:

  • 有没有办法让它表现得像一个 LIKE 运算符? (即“FIND”查找也将匹配“FINDME”)
  • 我还没有找到答案。这似乎应该是可能的,但我不知道如何做到这一点。
猜你喜欢
  • 2023-03-28
  • 2016-07-23
  • 2019-07-11
  • 2018-04-09
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2018-08-22
  • 2021-10-29
相关资源
最近更新 更多