查询 Django 模型的 JSONField 的内容
Query the contents of a Django model's JSONField
我正在尝试找出一种方法来查询模型特定实例上的 postgres JSONField 中的数据。
据我所见,所有用例都相当于如果你有一个属性 JSONField,然后选择你的模型的所有实例,其中属性 ->> color = 'red' 或随便。
让我们举一个更真实的例子,假设我们有一个模型 Shoe
,它有价格和数量以及其他字段,还有一个名为 versions
的 JSONField,它是一个对象数组,每个对象都有使每个版本特别的东西。
因此,如果 Shoe 模型的一个实例是 Air Jordans,则属性 JSONField 可能如下所示:
[
{
color: black,
edition: limited,
tongueColor: red
},
{
color: black,
edition: standard
},
{
color: gold,
edition: fancy,
bright: very
}
]
所以我们可以做两件事,我们可以:
- 查询所有有颜色可用版本的鞋子的型号:黑色(return 我们的 Air Jordans,可能还有其他鞋子),或
- 查询 color = black 的 JSONField 版本中所有对象的模型实例。因此,如果我们已经有了
Shoe.objects.filter(name='Air Jordans')
之类的东西,可以在末尾附加一些方法或东西到 return 上面的前两个对象 color == black
?
我可以在网上找到做第一个的例子,但找不到第二个。
我可以将对象放入内存并从那里进行过滤,但是这个 JSONField 是我希望存储大量任意数据的地方,因此能够在不将整个 blob 放入内存的情况下进行查询是相当重要的。 JSONField 可以支持吗?
这可能对你有用:
Shoes.objects.filter(yourJsonFieldName__contains={'colors': 'black'})
@AntoinePinsard 为我指出了正确的方向 - json_to_recordset()。
我目前使用的是:
SELECT * FROM (
SELECT j.* from shoes, json_to_recordset(json_field_name) as
j(color text, edition text, tongueColor: text, bright text) where
shoes.shoe_name = 'Air Jordan'
) subset
WHERE subset.color= "black"
因此内部 select 语句将在内部构建一个如下所示的记录集:
color | edition | tongueColor | bright
------+----------+-------------+--------
black | limited | red |
black | standard | |
gold | fancy | | very
然后外部语句将查询该内部记录集(在这种情况下,其中 color = 'black' 并且将 return:
color | edition | tongueColor | bright
------+----------+-------------+--------
black | limited | red |
black | standard | |
感谢大家的帮助!
我正在尝试找出一种方法来查询模型特定实例上的 postgres JSONField 中的数据。
据我所见,所有用例都相当于如果你有一个属性 JSONField,然后选择你的模型的所有实例,其中属性 ->> color = 'red' 或随便。
让我们举一个更真实的例子,假设我们有一个模型 Shoe
,它有价格和数量以及其他字段,还有一个名为 versions
的 JSONField,它是一个对象数组,每个对象都有使每个版本特别的东西。
因此,如果 Shoe 模型的一个实例是 Air Jordans,则属性 JSONField 可能如下所示:
[
{
color: black,
edition: limited,
tongueColor: red
},
{
color: black,
edition: standard
},
{
color: gold,
edition: fancy,
bright: very
}
]
所以我们可以做两件事,我们可以:
- 查询所有有颜色可用版本的鞋子的型号:黑色(return 我们的 Air Jordans,可能还有其他鞋子),或
- 查询 color = black 的 JSONField 版本中所有对象的模型实例。因此,如果我们已经有了
Shoe.objects.filter(name='Air Jordans')
之类的东西,可以在末尾附加一些方法或东西到 return 上面的前两个对象color == black
?
我可以在网上找到做第一个的例子,但找不到第二个。
我可以将对象放入内存并从那里进行过滤,但是这个 JSONField 是我希望存储大量任意数据的地方,因此能够在不将整个 blob 放入内存的情况下进行查询是相当重要的。 JSONField 可以支持吗?
这可能对你有用:
Shoes.objects.filter(yourJsonFieldName__contains={'colors': 'black'})
@AntoinePinsard 为我指出了正确的方向 - json_to_recordset()。
我目前使用的是:
SELECT * FROM (
SELECT j.* from shoes, json_to_recordset(json_field_name) as
j(color text, edition text, tongueColor: text, bright text) where
shoes.shoe_name = 'Air Jordan'
) subset
WHERE subset.color= "black"
因此内部 select 语句将在内部构建一个如下所示的记录集:
color | edition | tongueColor | bright ------+----------+-------------+-------- black | limited | red | black | standard | | gold | fancy | | very
然后外部语句将查询该内部记录集(在这种情况下,其中 color = 'black' 并且将 return:
color | edition | tongueColor | bright ------+----------+-------------+-------- black | limited | red | black | standard | |
感谢大家的帮助!