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

How do I query a complex JSONB field in Django 1.9

我有一个 table item,其中有一个名为 data 的字段,类型为 JSONB。我想查询所有文本等于 'Super' 的项目。我正在尝试通过这样做来做到这一点:

Item.objects.filter(Q(data__areas__texts__text='Super'))

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

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

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

下面是 data 字段内容的示例:

{
  "areas": [
    {
      "texts": [
        {
          "text": "Super"
        }
      ]
    },
    {
      "texts": [
        {
          "text": "Duper"
        }
      ]
    }
  ]
}

尝试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 查询语法介绍

希望对您有所帮助