Python Django filter JSONField目录列表
我使用新的JSONField运行Django 1.9,并具有以下测试模型:Python Django filter JSONField目录列表,python,django,django-models,django-queryset,django-jsonfield,Python,Django,Django Models,Django Queryset,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", } }, {
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__1__fixed_key_1="foo2")
>>> Test.objects.filter(actions__0__fixed_key_1="foo2")
事实并非如此,这是有道理的。我想做一些类似的事情:
>>> Test.objects.filter(actions__values__fixed_key_1="foo2")
或
并在queryset中进行测试
你知道这是否可以实现,以及如何实现吗?你可以使用这个软件包,我想它已经是你正在使用的软件包了
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数据库。
< P>您应该能够使用<代码>包含< <代码> >查找,并将查询值作为列表记录。查找的行为与ArrayField完全相同。因此,类似这样的方法应该会奏效:Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
如果不想按DICT数组中的某个字段筛选数据,可以尝试以下查询:
Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
它将列出所有Test
对象,这些对象在actions
字段中至少有一个对象,该字段包含值foo2
的键fixed\u key\u 1
即使您不知道实际索引,它也应该适用于嵌套查找:
Test(actions=[
{'fixed_key_1': 'foo4', 'fixed_key_3': [
{'key1': 'foo2'},
]}
}).save()
Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
简单地说,contains将忽略所有其他内容
不幸的是,若嵌套元素是一个对象,那个么您必须知道键名。在这种情况下,按值查找将不起作用。我实际上已经在使用PostgreSQL的JSONField特定模型字段(
来自django.contrib.postgres.fields import JSONField
)。当您的_属性
已知时(在我的情况下,固定键u 1
和固定键u 2
),您的解决方案有效,但当我不知道您的_属性
(随机键35;
在我的情况下)?您应该将{固定键u 1':'foo2}设置为您的参数,我用泛型函数更新了代码。问题是我不知道你的属性。它可以是任何东西,我甚至不关心它,只是想知道JSONField是否在其任何值中包含给定的字符串,而不管其深度如何。请给出一个示例,说明您将在测试过滤器
方法中插入什么,以查看“bar3”
是否包含在JSONField中的任何位置,知道除了固定钥匙1
和固定钥匙2
之外,您不知道任何钥匙因为我不认为我们讨论的是同一个问题。这不起作用。它说这不是json类型的有效语法。