2016-09-27 11 views
1

テーブルitemには、タイプJSONBのdataというフィールドがあります。私は 'スーパー'と等しいテキストを持つすべてのアイテムを照会したいと思います。私はこれを行うことによって、現在、これを行うにしようとしています:Django 1.9で複雑なJSONBフィールドを照会する方法

Item.objects.filter(Q(data__areas__texts__text='Super'))

Djangoのデバッグツールバーは、このために使用されるクエリがある報告されています

WHERE "item"."data" #> ARRAY['areas', 'texts', 'text'] = '"Super"'

しかし、私は任意のマッチングをバック届きません結果。 Djangoを使ってこれをどのように問い合わせることができますか? Djangoでこれができない場合は、PostgreSQLでこれをどのように問い合わせることができますか?ここで

dataフィールドの内容の例です:

{ 
    "areas": [ 
    { 
     "texts": [ 
     { 
      "text": "Super" 
     } 
     ] 
    }, 
    { 
     "texts": [ 
     { 
      "text": "Duper" 
     } 
     ] 
    } 
    ] 
} 

答えて

1

それが正確な答えではありませんItem.objects.filter(data__areas__0__texts__0__text='Super')

を試みるが、それはいくつかのjsonbフィルタ機能を明確にすることができ、またdjango docs

を読みます私はあなたがこの構造で何を達成したいのか分かりませんが、奇妙な生のクエリでしか望みの結果を得ることはできませんでした。これは次のようになります:

Item.objects.raw("SELECT id, data FROM (SELECT id, data, jsonb_array_elements(\"table_name\".\"data\" #> '{areas}') as areas_data from \"table_name\") foo WHERE areas_data #> '{texts}' @> '[{\"text\": \"Super\"}]'")

いけない(あなたのケースで、それはyourappname_itemする必要があります)クエリでtable_nameを変更することを忘れ。

実際のプログラムでこのクエリを使用できるかどうかは不明ですが、より良い解決策を見つける方法を見つけるのに役立つかもしれません。

また、クエリ構文

をjsonbするthere is非常に良いイントロが、それは `私が探しています何の仕事をしてではなく、あなた

+0

' Item.objects.filter(data__areas__0__texts__0__text = 'スーパー')を助けることを願っています私はそれが配列のすべての要素を検索したいので。生のクエリは私が探しているものですが、ありがとうございます。残念なことに、私はDjangoを使ってこれを行うことはできませんが、もし車が自分自身を運転できるなら、希望があると思います;) – Chad

関連する問題