Django 过滤器 JSONField 字典列表 [英] Django filter JSONField list of dicts
问题描述
我使用新的 JSONField 运行 Django 1.9 并具有以下测试模型:
类测试(TimeStampedModel):动作 = 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")并在查询集中进行测试.
知道这是否可以完成以及如何完成吗?
如果您不想通过 dicts 数组中的一个字段来过滤数据,您可以尝试以下查询:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
它将列出所有 Test
对象,这些对象在 actions
字段中至少有一个对象,该对象包含值 foo2<的键
fixed_key_1
/代码>.
它也适用于嵌套查找,即使您不知道实际索引:
Test(actions=[{'fixed_key_1':'foo4','fixed_key_3':[{'key1': 'foo2'},]}}).保存()Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
简单来说,包含将忽略其他所有内容.
不幸的是,如果嵌套元素是一个对象,您必须知道键名.在这种情况下,按值查找将不起作用.
I run Django 1.9 with the new JSONField and have the following Test model :
class Test(TimeStampedModel):
actions = JSONField()
Let's say the action JSONField looks like this :
[
{
"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",
}
}
]
I want to be able to filter the foo1 and foo2 keys for every item of the list. When I do :
>>> Test.objects.filter(actions__1__fixed_key_1="foo2")
The Test is in the queryset. But when I do :
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
It isn't, which makes sense. I want to do something like :
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
Or
>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")
And have the Test in the queryset.
Any idea if this can be done and how ?
If you wan't to filter your data by one of fields in your array of dicts, you can try this query:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
It will list all Test
objects that have at least one object in actions
field that contains key fixed_key_1
of value foo2
.
Also it should work for nested lookup, even if you don't know actual indexes:
Test(actions=[
{'fixed_key_1': 'foo4', 'fixed_key_3': [
{'key1': 'foo2'},
]}
}).save()
Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
In simple words, contains will ignore everything else.
Unfortunately, if nested element is an object, you must know key name. Lookup by value won't work in that case.
这篇关于Django 过滤器 JSONField 字典列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!