2016-09-27 80 views
1

查詢複雜JSONB場我有一個表item用一種稱爲JSONB的data領域。我想查詢所有文字等於'超級'的項目。我試圖做到這一點目前這樣做:如何在Django 1.9

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\"}]'")

不要忘記更改table_name查詢(在你的情況應該是yourappname_item)。

不確定您可以在真實程序中使用此查詢,但它可能可以幫助您找到更好的解決方案。

此外,there is很好的介紹到jsonb查詢語法

希望它會幫助你

+0

'Item.objects.filter(data__areas__0__texts__0__text = '超級')'的工作,但不是我要找因爲我希望它能夠搜索數組中的每個元素。原始查詢是我正在尋找的,儘管如此謝謝。不幸的是,我不能使用Django做到這一點,但如果汽車能夠駕駛自己,那麼我認爲這是希望;) – Chad