如何在 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 查询语法介绍
希望对您有所帮助
我有一个 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 查询语法介绍
希望对您有所帮助