查询 Django 模型的 JSONField 的内容



我正试图找到一种方法,在我的模型的特定实例上查询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 
    } 
]

所以我们可以做两件事:

  1. 查询型号中所有可用颜色的鞋子:黑色(这将返回我们的Air Jordans,可能还有其他鞋子),或者
  2. 查询模型实例中颜色为黑色的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------+----------+-------------+--------黑色|限量|红色|黑色|标准||

谢谢大家的帮助!