2016-07-25 2 views
3

내 모델의 특정 인스턴스에서 Postgres JSONField 내부의 데이터를 쿼리하는 방법을 찾으려고합니다.Django 모델의 JSONField 내용 쿼리

모든 사용 사례는 JSONField 특성이있는 경우와 동일한 특성을 갖는 경우에 사용되며 특성 - >> color = 'red'또는 기타와 같은 모델 인스턴스를 모두 선택하는 것과 같습니다.

좀더 실제적인 예를 들어 보겠습니다. 모델이 Shoe이고 필드의 가격과 수량이 같지만 객체의 배열 인 versions이라는 JSONField라고 가정 해 봅시다. 각 버전을 특별하게 만드는 것들.

신발 모델의 하나 개의 인스턴스가 에어 조던 경우 그래서, 속성은 JSONField처럼 볼 수 있었다 :

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

그래서 우리가 할 수있는 두 가지가있다, 우리가 할 수있는 :

  1. 쿼리 모델 검은 색 (Air Jordans를 반환하는 플러스 어쩌면 다른 신발)이있는 모든 신발 또는
  2. color = black 인 JSONField 버전 내의 모든 개체에 대해 모델의 인스턴스를 쿼리합니다. 그래서 만약 우리가 이미 Shoe.objects.filter(name='Air Jordans') 또는 무엇인가 가지고 있다면, 끝 부분의 어떤 메소드 나 뭔가를 집어 넣을 수 있습니다. 위의 처음 두 객체를 반환합니다. color == black?

온라인으로 예를 찾을 수 있지만 두 번째로는 할 수 없습니다.

개체를 메모리와 필터로 가져올 수 있지만이 JSONField는 매우 많은 양의 임의 데이터를 저장하기를 원하기 때문에 전체 BLOB를 메모리로 가져 오지 않고 쿼리 할 수 ​​있다는 것이 매우 중요합니다 . JSONField가이를 지원합니까?

+0

우리가 두 번째 작업을 수행 할 수 있다는 것을 어떻게 아십니까? – 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 * 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 

후 외부 문은 그 내부를 조회 할 것이다 레코드 세트 (이 경우 color = 'black'이고 반환 값 :

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

모두 도와 줘서 고마워!

+0

Django ORM에이 솔루션을 사용할 수 있었습니까? – skulk001

1

이 당신을 위해 작동 할 수 있습니다

Shoes.objects.filter(yourJsonFieldName__contains={'colors': 'black'})