如何在Django 1.9中查询复杂的JSONB字段

时间:2016-09-27 18:24:57

标签: json django postgresql jsonb

我有一个表data,其中包含一个名为Item.objects.filter(Q(data__areas__texts__text='Super'))的JSONB类型的字段。我想查询所有文本等于'超级'的项目。我正在尝试这样做:

WHERE "item"."data" #> ARRAY['areas', 'texts', 'text'] = '"Super"'

Django调试工具栏报告用于此的查询是:

data

但我没有找回任何匹配的结果。如何使用Django查询?如果在Django中不可能,那么如何在Postgresql中查询?

以下是{ "areas": [ { "texts": [ { "text": "Super" } ] }, { "texts": [ { "text": "Duper" } ] } ] } 字段内容的示例:

{{1}}

1 个答案:

答案 0 :(得分:1)

尝试Item.objects.filter(data__areas__0__texts__0__text='Super')

这不是确切的答案,但它可以澄清一些jsonb过滤器功能,也可以阅读django docs

我不确定你想用这个结构实现什么,但我只能通过奇怪的原始查询获得所需的结果,它看起来像这样:

Item.objects.raw("SELECT id, data FROM (SELECT id, data, jsonb_array_elements(\"table_name\".\"data\" #> '{areas}') as areas_data from \"table_name\") foo WHERE areas_data #> '{texts}' @> '[{\"text\": \"Super\"}]'")

不要忘记更改查询中的table_name(在您的情况下应该是yourappname_item)。

不确定您是否可以在实际程序中使用此查询,但它可能可以帮助您找到更好的解决方案。

此外,there is非常好的介绍jsonb查询语法

希望它能帮到你