查询Django模型的JSONField的内容
我试图找出一种方法来查询模型特定实例上PostgresJSonfield中的数据 从我所看到的情况来看,所有的用例都相当于如果你有一个属性JSONField,然后选择所有属性->>color='red'或其他属性的模型实例 让我们举一个更真实的例子,假设我们有一个模型鞋,它有价格和数量等字段,还有一个叫做versions的JSONField,它是一个对象数组,每个对象都有使每个版本特别的东西 因此,如果鞋模型的一个实例是Air Jordans,那么属性JSONField可能如下所示:查询Django模型的JSONField的内容,django,postgresql,django-models,django-orm,jsonb,Django,Postgresql,Django Models,Django Orm,Jsonb,我试图找出一种方法来查询模型特定实例上PostgresJSonfield中的数据 从我所看到的情况来看,所有的用例都相当于如果你有一个属性JSONField,然后选择所有属性->>color='red'或其他属性的模型实例 让我们举一个更真实的例子,假设我们有一个模型鞋,它有价格和数量等字段,还有一个叫做versions的JSONField,它是一个对象数组,每个对象都有使每个版本特别的东西 因此,如果鞋模型的一个实例是Air Jordans,那么属性JSONField可能如下所示: [
[
{
color: black,
edition: limited,
tongueColor: red
},
{
color: black,
edition: standard
},
{
color: gold,
edition: fancy,
bright: very
}
]
所以我们可以做两件事,我们可以:
查询所有颜色为“黑色”的可用版本的鞋的型号,这将返回我们的Air Jordan鞋,加上其他鞋,或者
在模型实例中查询颜色为黑色的JSONField版本中的所有对象。因此,如果我们已经有Shoe.objects.filtername='Air Jordans'或其他东西,那么我们可以在最后附加一些方法或其他东西,只返回前面两个对象,其中color==black?
我可以在网上找到做第一件事的例子,但不能找到第二件事
我可以将对象放入内存并从那里进行过滤,但是这个JSONField是我希望存储大量任意数据的地方,因此能够在不将整个blob放入内存的情况下进行查询是相当重要的。JSONField是否支持此功能?这可能适用于您:
Shoes.objects.filter(yourJsonFieldName__contains={'colors': 'black'})
@AntoinePinsard为我指出了正确的方向——json_到_记录集 我目前正在使用类似于:
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
然后outer语句将在本例中查询该内部记录集,其中color='black',并返回:
color | edition | tongueColor | bright
------+----------+-------------+--------
black | limited | red |
black | standard | |
谢谢大家的帮助 你怎么知道我们可以做第二件事?我不太确定,但我认为你可以做这样的事情。filterversions\uuuuu contains={'color':'black'}或.filterversions\uuuuuu contains=[{'color':'black'}]。否则,您可能应该创建一些自定义查找,并使用json_to_记录集@valentjedi-我不知道这是否可行,很可能不可行。@AntoinePinsard-。过滤器应该返回我希望返回json blob部分的Shoe实例。然而,json_to_记录集看起来就像我在寻找的一样。将需要做一些研究,研究如何让它与Django的ORM一起使用,但肯定是一个很好的线索。谢谢您能够将此解决方案应用到Django ORM中吗?