查询 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 
    } 
]

所以我们可以做两件事,我们可以:

  1. 查询所有有颜色可用版本的鞋子的型号:黑色(return 我们的 Air Jordans,可能还有其他鞋子),或
  2. 查询 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 |             |

感谢大家的帮助!