当前位置:  开发笔记 > 编程语言 > 正文

Django过滤JSONField dicts列表

如何解决《Django过滤JSONFielddicts列表》经验,为你挑选了1个好方法。

我使用新的JSONField运行Django 1.9并具有以下Test模型:

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")

并在查询集中进行测试.

知道是否可以这样做以及如何做?



1> GwynBleidD..:

如果您不想通过数组中的某个字段过滤数据,则可以尝试以下查询:

Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])

它将列出Testactions字段中包含至少一个包含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'}]}])

简单来说,contains会忽略其他所有内容.

不幸的是,如果嵌套元素是一个对象,则必须知道密钥名称.在这种情况下,按值查找将不起作用.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有