【发布时间】:2016-11-29 00:43:20
【问题描述】:
我正在尝试找出一种方法来在我的模型的特定实例上查询 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
}
]
所以我们可以做两件事,我们可以:
- 在模型中查询所有有可用颜色版本的鞋子:黑色(这将返回我们的 Air Jordans,可能还有其他鞋子),或者
- 查询模型实例以查找 JSONField 版本中颜色 = 黑色的所有对象。因此,如果我们已经有了
Shoe.objects.filter(name='Air Jordans')或其他东西,可以在最后添加一些方法或其他东西,只返回color == black上面的前两个对象?
我可以在网上找到第一个做的例子,但不是第二个。
我可以将对象放入内存并从那里过滤,但这个 JSONField 是我希望存储大量任意数据的地方,因此能够在不将整个 blob 放入内存的情况下进行查询是相当重要的。 JSONField 可以支持吗?
【问题讨论】:
-
你怎么知道我们可以做第二件事?
-
我不太确定,但我认为你可以这样做
.filter(versions__contains={'color': 'black'})或.filter(versions__contains=[{'color': 'black'}])。否则,您可能应该创建一些自定义查找并使用json_to_recordset()postgresql.org/docs/9.5/static/… -
@valentjedi - 我不知道这是否可能,很可能不是。
-
@AntoinePinsard -
.filter应该返回 Shoe 实例,我希望返回部分 JSON blob。json_to_recordset()但是看起来它可以满足我的需求。需要对如何使用 Django 的 ORM 进行一些研究,但绝对是一个很好的领导。谢谢!
标签: django postgresql django-models django-orm jsonb