我使用新的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")

并在查询集中进行测试。
你知道这能不能做吗?怎么做?

最佳答案

如果不按dict数组中的某个字段筛选数据,可以尝试执行以下查询:

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

它将列出在Test字段中至少有一个对象的所有actions对象,该对象包含值为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'}]}])

简单来说,包含将忽略其他所有内容。
不幸的是,如果嵌套元素是一个对象,您必须知道键名。在这种情况下,按值查找不起作用。

关于python - Django过滤JSONField dicts列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34358278/

10-11 15:43