我使用新的jsonfield运行django 1.9,并具有以下测试模型:
class Test(TimeStampedModel):
actions = JSONField()
假设动作jsonfield如下所示:
[
{
"fixed_key_1": "foo1",
"fixed_key_2": {
"random_key_1": "bar1",
"random_key_2": "bar2",
}
},
{
"fixed_key_1": "foo2",
"fixed_key_2": {
"random_key_3": "bar2",
"random_key_4": "bar3",
}
}
]
我希望能够过滤列表中每个项目的foo1和foo2键。
当我这样做的时候:
>>> Test.objects.filter(actions__1__fixed_key_1="foo2")
测试在查询集中。但当我这样做的时候:
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
事实并非如此,这是有道理的。我想做如下的事情:
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
或
>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")
并在查询集中进行测试。
你知道这能不能做吗?怎么做?
最佳答案
如果不按dict数组中的某个字段筛选数据,可以尝试执行以下查询:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
它将列出在
Test
字段中至少有一个对象的所有actions
对象,该对象包含值为fixed_key_1
的键。此外,它还可以用于嵌套查找,即使您不知道实际的索引:
Test(actions=[
{'fixed_key_1': 'foo4', 'fixed_key_3': [
{'key1': 'foo2'},
]}
}).save()
Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
简单来说,包含将忽略其他所有内容。
不幸的是,如果嵌套元素是一个对象,您必须知道键名。在这种情况下,按值查找不起作用。
关于python - Django过滤JSONField dicts列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34358278/