2016-09-27 8 views
1

테이블 item에 JSONB 유형의 data이라는 필드가 있습니다. '슈퍼'와 같은 텍스트가있는 모든 항목을 쿼리하고 싶습니다. 나는이 작업을 수행하여 현재이 작업을 수행하려고 :장고 1.9에서 복잡한 JSONB 필드를 쿼리하는 방법

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

그러나 나는 어떤 일치를 다시받지 못했습니다 :

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

장고 디버그 도구 모음이 사용되는 쿼리를보고하는 것은 결과. 어떻게하면 장고를 사용하여 쿼리 할 수 ​​있습니까? 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을 변경하는 것을 잊지.

실제 프로그램에서이 쿼리를 사용할 수 있는지 확실하지 않지만 더 나은 솔루션을 찾는 방법을 찾는데 도움이 될 것입니다.

또한, there is 아주 좋은 소개가

가 당신에게

+0

'Item.objects.filter (data__areas__0__texts__0__text = '슈퍼')를 도움이 될 것입니다 희망 쿼리 구문을 jsonb하는'작업을 수행,하지만 난 찾고 있어요되지 무엇을 왜냐하면 내가 배열의 모든 원소를 검색하기를 원하기 때문이다. 생 쿼리는 내가 찾고있는 것이므로 감사합니다. 불행한 점은 장고를 사용해서는 안되지만 자동차로 운전할 수 있다면 희망이 있다고 생각합니다.) – Chad

관련 문제