2011-02-26 2 views
1

django에서 json 직렬화를 제어하는 ​​방법이 있습니까? 간단한 코드가 아래 JSON에 직렬화 된 객체를 반환합니다django : json serialization 제어

co = Collection.objects.all() 
c = serializers.serialize('json',co) 

json으로이 유사합니다 :

[ 
    { 
     "pk": 1, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "architecture", 
      "name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430", 
      "sortOrder": 0 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "nature", 
      "name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430", 
      "sortOrder": 1 
     } 
    }, 
    { 
     "pk": 3, 
     "model": "picviewer.collection", 
     "fields": { 
      "urlName": "objects", 
      "name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442", 
      "sortOrder": 2 
     } 
    } 
] 

당신은 당신이 할 수있는 방식으로 그것을 직렬화있어 볼 수를 다시 작성 전체 모델에서, 어떤 시점에서 이것을하고 싶습니까? 제 경우에는 단순한 JS 아약스에 대해서는별로 유용하지 않지만, 트래픽을 최소화하고 모든 것을 조금 더 명확하게 만들고 싶습니다.

[ 
{% if collections %} 
    {% for c in collections %} 
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %} 
    {% endfor %} 
{% endif %} 
] 

이 수행 작업과 출력 : 내가 무슨 짓을

내가 "더 좋은"JSON 출력을 생성하기 위해 .json 템플릿과 같은 것을 할 것입니다 템플릿 객체를 전달하는 뷰를 생성 훨씬 더 좋은 (?) : 그러나, 나는 내 솔루션 템플릿 (처리 가능한 성능에 미치는 영향에 추가 단계)를 사용하고 내가 개정하고 유지하기 위해 수작업을 할 것이라는 빠른에 의해 방해하고있어

[ 
    { 
     "id": 1, 
     "sortOrder": 0, 
     "name": "Город и архитектура", 
     "urlName": "architecture" 
    }, 
    { 
     "id": 2, 
     "sortOrder": 1, 
     "name": "Природа", 
     "urlName": "nature" 
    }, 
    { 
     "id": 3, 
     "sortOrder": 2, 
     "name": "Объекты и натюрморт", 
     "urlName": "objects" 
    } 
] 

예를 들어, 모델.

나는 json 생성이 모델의 일부가되어야한다고 생각하고있다. (내가 틀렸다면 나에게 맞춰라.) 원시 python-json과 django 구현으로 끝났지 만, 비트 조각을 제거하는 방법을 생각할 수 없다. 원하지 않아.

한 가지 더요 - 직렬화 할 일련의 필드를 제한하는 경우에도 요소 컨테이너 외부에 항상 ID를 유지하고 그 대신에 ID 필드를 "pk"로 표시합니다.

답변

2

정말 쉽습니다. 빠른 예 :

{"string": "test", 
"number": 42, 
"array": [1, 2, 3], 
"js_object": {foo: "bar"}} 

편집 :이보기는 다음과 같은 JSON의 상당을 반환합니다

from django.http import HttpResponse 
from django.utils import simplejson 

def simple_view(request): 
    response = {'string': "test", 
       'number': 42, 
       'array': [1, 2, 3], 
       'js_object': dict(foo="bar")} 
    return HttpResponse(simplejson.dumps(response), 
         mimetype="application/json") 

는 그리고 네, 아사 프 라비이 옳다, 템플릿은 무효 JSON을 분출 할 수 있습니다.

+0

이 배열에 대해 작동하지만 장고 모드는이 방식으로 직렬화 할 수 있다고 생각하지 않습니다. – abolotnov

+0

필자는 그가 원하는 모델 객체의 필드를 list 나 dict 같은 JSON 직렬화 가능 유형으로 복사해야 함을 의미한다고 생각합니다. 'obj = Collection.objects.get (pk = 1); simplejson.dumps (dict (urlName = obj.urlName, name = obj.name, sortOrder = obj.sortOder)'. 그러나 [다른 사람의 대답]처럼 (http://stackoverflow.com/questions/5129794/django- control-json-serialization/5130423 # 5130423), 피스톤이 당신을 위해이 단계를 수행 할 수 있습니다 :) – Bluu

+0

일부 수동 사전 처리로 다소 효과가 있습니다 - 일부 모델 필드는 simplejson에 의해 직렬화 할 수 없으며 변환해야합니다 문자열에 :( – abolotnov

2

직접 json과 같은 문자열을 직접 작성하는 대신 데이터를 인코딩하는 데 the json library을 사용하는 것이 좋습니다. 위의 코드는 한 가지 이유로 제대로 이스케이프 처리하지 못하는 것 같습니다. 그리고 독자적인 시리얼 라이저를 작성하는 것만으로도 얻을 수있는 것은별로 없습니다 (버그 제외).

0

직접 작성하는 대신 Piston이 장고 모델을 JSON으로 직렬화하는 작업을 수행하도록하십시오. 기본적으로 모델의 필드는 메타 데이터없이 직렬화됩니다. 또한 관련 필드를 포함하거나 제외 할 필드를 쉽게 나열 할 수 있습니다. 추가 템플릿이없고보기 코드도 거의 없습니다.

+0

피스톤이 지원되지 않는 것 같습니다. 마지막 코드가 6 개월 전에 커밋되었지만 문제가 회신/해결되지 않는 것 같습니다. – abolotnov

+0

Fair. 나는 당신이 성공으로 필요로하는 것과 정확히 일치하는 내부 회사 프로젝트에서이 프로젝트를 사용하고 있지만 오래 동안 열린 버그를 해결해야만했습니다. 대안으로, 새로운 섹시 함을 원하면 [Tastypie] (https : // github.com/toastdriven/django-tastypie). – Bluu

+0

jesper의 승인을받은 진행중인 커뮤니티 포크가 있습니다. 피스톤의 저자입니다. 개방 된 버그를 닫는 많은 포크에 설치해야합니다. 예를 들어, 광산, http://bitbucket.org/wires/django-piston – wires

0
def view(request): 
    m_all = list(model.objects.all().values()) 

    return HttpResponse(simplejson.dumps(m_all)) 

이렇게하면 문제가 해결됩니다. values ​​()를 사용하고 목록으로 변환하면 원하는 결과를 얻을 수 있습니다.