Django过滤器JSONField字典列表
我使用新的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")
并在查询集中进行测试。
任何想法,如果这可以完成和如何?
如果您不想通过数组中的某个字段过滤数据,则可以尝试以下查询:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
它将列出所有在actions
字段中至少包含一个对象的Test
对象,其中包含值为foo2
关键字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'}]}])
简而言之,包含将忽略其他所有内容。
不幸的是,如果嵌套元素是一个对象,你必须知道键名。 按价值查找在这种情况下不起作用。
您应该可以使用__contains
查找,如此处所述。 查找仍然像DhiaTN上面推荐的那样。 所以,这样的事情应该工作:
Test.objects.filter(actions__contains={'fixed_key_1': 'foo2'})
你可以使用django-jsonfield包,我猜它已经是你正在使用的包了。
from jsonfield import JSONField
class Test(TimeStampedModel):
actions = JSONField()
因此,要搜索具有特定属性的搜索,只需执行以下操作:
def test_filter(**kwargs):
result = Test.objects.filter(actions__contains=kwargs)
return result
如果您正在使用PostgreSQL,也许您可以利用PostgreSQL特定的模型字段。
PS:如果你正在处理很多JSON结构,你可能会考虑使用NoSQL数据库。
链接地址: http://www.djcxy.com/p/38653.html