Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询Django模型的JSONField的内容_Django_Postgresql_Django Models_Django Orm_Jsonb - Fatal编程技术网

查询Django模型的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可能如下所示: [

我试图找出一种方法来查询模型特定实例上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中吗?