我正试图找到一种方法,在我的模型的特定实例上查询postgres JSONField中的数据。
根据我所看到的,所有的用例都相当于如果你有一个属性JSONField,然后选择你的模型的所有实例,其中attributes->>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
}
]
所以我们可以做两件事:
- 查询型号中所有可用颜色的鞋子:黑色(这将返回我们的Air Jordans,可能还有其他鞋子),或者
- 查询模型实例中颜色为黑色的JSONField版本中的所有对象。所以,如果我们已经有了
Shoe.objects.filter(name='Air Jordans')
或其他东西,可以在最后添加一些方法或其他东西来返回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------+----------+-------------+--------黑色|限量|红色|黑色|标准||黄金
然后外部语句将查询该内部记录集(在这种情况下,其中color='black',并返回:
color|edition|tongueColor|bright------+----------+-------------+--------黑色|限量|红色|黑色|标准||
谢谢大家的帮助!