我有一个表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}}
答案 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查询语法
希望它能帮到你