2016-07-25 6 views
3

私のモデルの特定のインスタンスで、postgres JSONField内のデータを照会する方法を見つけようとしています。DjangoモデルのJSONFieldの内容を照会します。

すべてのユースケースは、属性JSONFieldを持っていて、次に属性の>> - color = 'red'などのモデルのすべてのインスタンスを選択した場合と同等のものです。

Shoeというモデルがあり、値段と数量などをフィールドとしているが、オブジェクトの配列であるversionsというJSONFieldもあるとしよう。それぞれのバージョンを特別にするもの

靴モデルの1つのインスタンスは、エア・ジョーダンであれば、属性がJSONFieldは、次のようになります。

[ 
    { 
     color: black, 
     edition: limited, 
     tongueColor: red 
    }, 
    { 
     color: black, 
     edition: standard 
    }, 
    { 
     color: gold, 
     edition: fancy, 
     bright: very 
    } 
] 

だから我々が行うことができる2つのものがあります、私たちは次のことができます。

  1. クエリモデル
  2. color = blackのJSONFieldバージョン内のすべてのオブジェクトのモデルのインスタンスを照会します。だから我々はすでにShoe.objects.filter(name='Air Jordans')か何かを持っていた場合は、ちょうど上記の最初の2つのオブジェクトを返すいくつかの方法や何かの上にタックできるcolor == black

私はオンラインで最初のものを見つけることができますが、2番目のものではありません。

私はオブジェクトをメモリに持ち込んでそこからフィルタリングすることができますが、このJSONFieldは非常に大量の任意のデータを格納することを望んでいるため、ブロブ全体をメモリに取り込まずにクエリできることは非常に重要です。 JSONFieldでこれをサポートできますか?

+0

私たちは第2のことをやり遂げることができますか? – valignatev

+1

私は確信していませんが、この '.filter(versions__contains = {'color': 'black'})'や '.filter(versions__contains = [{'color': 'black'} ]) '。それ以外の場合は、カスタムルックアップを作成し、 'json_to_recordset()'を使用してください。https://www.postgresql.org/docs/9.5/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE –

+0

@valentjedi - 私は持っていますこれが可能かどうかは考えられませんが、可能ではありません。 – cbrainerd

答えて

1

@AntoinePinsardは正しい方向に私を指摘 - json_to_recordsetを()。

私は現在のようなもの使用しています。だから、内側のSELECT文は、内部で次のようになりますレコードセット構築します

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" 

を:

 
color | edition | tongueColor | bright 
------+----------+-------------+-------- 
black | limited | red   | 
black | standard |    | 
gold | fancy |    | very 

をして、外側の文が内部ことを照会しますレコードセット(この場合、color = 'black'の場合は返されます):

 
color | edition | tongueColor | bright 
------+----------+-------------+-------- 
black | limited | red   | 
black | standard |    | 

みんな助けてくれてありがとう!

+0

このソリューションをDjango ORMに取り込めましたか? – skulk001

1

これはあなたのために働く可能性があります

Shoes.objects.filter(yourJsonFieldName__contains={'colors': 'black'}) 
関連する問題