Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django filter JSONField目录列表_Python_Django_Django Models_Django Queryset_Django Jsonfield - Fatal编程技术网

Python Django filter JSONField目录列表

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", } }, {

我使用新的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__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类型的有效语法。