Sce*_*e5S 13 python django django-models django-queryset django-jsonfield
我使用新的JSONField运行Django 1.9并具有以下Test模型:
class Test(TimeStampedModel):
actions = JSONField()
Run Code Online (Sandbox Code Playgroud)
让我们说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",
}
}
]
Run Code Online (Sandbox Code Playgroud)
我希望能够为列表中的每个项目过滤foo1和foo2键.当我做 :
>>> Test.objects.filter(actions__1__fixed_key_1="foo2")
Run Code Online (Sandbox Code Playgroud)
测试位于查询集中.但当我这样做时:
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
Run Code Online (Sandbox Code Playgroud)
它不是,这是有道理的.我想做的事情如下:
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
Run Code Online (Sandbox Code Playgroud)
要么
>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")
Run Code Online (Sandbox Code Playgroud)
并在查询集中进行测试.
知道是否可以这样做以及如何做?
Gwy*_*idD 20
如果您不想通过数组中的某个字段过滤数据,则可以尝试以下查询:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
Run Code Online (Sandbox Code Playgroud)
它将列出Test在actions字段中包含至少一个包含fixed_key_1值键的对象的所有对象foo2.
它也适用于嵌套查找,即使您不知道实际索引:
Test(actions=[
{'fixed_key_1': 'foo4', 'fixed_key_3': [
{'key1': 'foo2'},
]}
}).save()
Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
Run Code Online (Sandbox Code Playgroud)
简单来说,contains会忽略其他所有内容.
不幸的是,如果嵌套元素是一个对象,则必须知道密钥名称.在这种情况下,按值查找将不起作用.
您应该能够使用__contains查找本,并通过查询值列表,记录在这里。查找的行为与 ArrayField 完全一样。所以,这样的事情应该工作:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
Run Code Online (Sandbox Code Playgroud)
您可以使用django-jsonfield包,我想它已经是您正在使用的包了。
from jsonfield import JSONField
class Test(TimeStampedModel):
actions = JSONField()
Run Code Online (Sandbox Code Playgroud)
因此,要搜索特定属性的搜索,您可以这样做:
def test_filter(**kwargs):
result = Test.objects.filter(actions__contains=kwargs)
return result
Run Code Online (Sandbox Code Playgroud)
如果您使用 PostgreSQL,也许您可以利用 PostgreSQL特定模型字段。
PS:如果您正在处理大量 JSON 结构,您可能需要考虑使用 NoSQL 数据库。
| 归档时间: |
|
| 查看次数: |
7950 次 |
| 最近记录: |