django - 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 中添加了一些注释,以明确我的每个数组中不仅有一个对象。我试图在任意索引处找到一个“绘图”,在包含该索引的任意索引处找到一个“externalData” "source": {"name": "FINDME"}
。
解决方案
您包含的结构需要匹配 JSON,从第一个数组开始。JSON 中的每一级数组都需要在 contains= 中表示
展示比说容易。像这样:
MyModel.objects.filter(
metadata__vis__plots__contains=[{'externalData': [{'source': {'name': 'FINDME'}}]}]
)
推荐阅读
- python - 正则表达式:匹配括号括起来的字符串中的某个单词
- c# - KeyBinding 用作 UserControl 但在 XAML 中使用属性元素语法时不起作用
- visual-c++ - 非成员函数和抽象类
- shell - 基于轮换在目录中查找和合并日志文件
- javascript - 如何播放捕获的视频?
- ruby - 如何使用两个布尔语句修复输入结束
- android - 当模拟对象在 lambda 内部时单元测试失败,但是当它在 lambda 外部并在 lambda 内部使用时工作?
- javascript - 将无效的 HTML 表解析为 JSON
- php - 正则表达式 HTML 注释 (PCRE)
- gitlab-ci-runner - 如何使用柯南遥控器配置 gitlab-runner?