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

并在查询集中进行测试。

任何想法,如果这可以完成和如何?


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

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

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

简而言之,包含将忽略其他所有内容。

不幸的是,如果嵌套元素是一个对象,你必须知道键名。 按价值查找在这种情况下不起作用。


您应该可以使用__contains查找,如此处所述。 查找仍然像DhiaTN上面推荐的那样。 所以,这样的事情应该工作:

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

你可以使用django-jsonfield包,我猜它已经是你正在使用的包了。

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数据库。

链接地址: http://www.djcxy.com/p/38653.html

上一篇: Django filter JSONField list of dicts

下一篇: Django Filter Queryset by Highest Rating