我在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'。
答案 0 :(得分:0)
容器的结构需要匹配JSON,从第一个数组开始。 JSON中的每个数组级别都需要用contains =
表示显示比说起来容易。像这样:
MyModel.objects.filter(
metadata__vis__plots__contains=[{'externalData': [{'source': {'name': 'FINDME'}}]}]
)