2009-10-23 3 views
18

내가 가진 개체의 무리를 직렬화하고 있습니다 : 내 필드 목록에서 'PK'를 포함하지 않은,하지만 생산 된 JSON 각 직렬화와 기본 키를 포함제거 PK 필드

json = serializers.serialize("json", objects, fields=('name', 'country')) 

목적. 내 API가 기본 키를 일반인에게 공개하는 것을 원하지 않습니다.

JSON 출력을 monging하지 말고 serializers.serialze()에 기본 키가 포함되지 않도록 알려주는 올바른 방법은 무엇입니까?

+0

@Josh 제국? 그것에 대해 이야기하는 티켓이 있습니다 @ http://code.djangoproject.com/ticket/4656 – orokusaki

+0

나는 수동으로 simplejson을 호출했습니다. –

답변

16

나는 '수동'나는 기본 simplejson 시리얼 라이저를 사용하여 원하는 것을 달성함으로써이 문제를 해결 작업 끝났다.

+0

그냥 json에 일부 데이터를 덤프하고 FK를 신경 쓰지 않으려면 훌륭한 해결책입니다. –

+0

@Josh API에서 5 가지 모델을 사용하는 28 가지 방법이 있다면 훨씬 더 코딩됩니다. – orokusaki

+0

이것을 사용했습니다. 그러나 여러 가지 견해에서 이것을 사용하는 것은 번거 롭습니다. Django의 시리얼 라이저를 사용하는 것이 가장 좋습니다. 마지막 답변은 생성 된 객체에서 pk 및 model 필드를 제거하는 방법을 설명하는 관련 질문에 대한 링크가 있습니다. – Dmitry

0

우리는 PK의 "살균"을 시도하는 데 시간을 낭비하지 않습니다. JSON 레코드를 생성 할 때 PK가 있으며 원하는 경우 사용자가 무시할 수 있습니다. 정보로는 아무 것도 할 수 없으므로 혼란 스러울뿐입니다.

우리 웹 서비스 인터페이스 중 누구도 PK를 다시 제공 할 수 없습니다. POST, PUT 및 DELETE 검색은 PK가 아닌 다른 필드에서 수행합니다.

그러나 HTML에는 PK의 URL이 항상 표시됩니다. 그것은 사람들이 페이지를 북마크 할 수있게 해줍니다.

from django.utils import simplejson 
json = simplejson.dumps([{'name': o.name, 
          'country': o.country} for o in objects]) 

조금 더 타이핑,하지만 작품 :

+7

많은 기업들은 순차적 인 기본 키 내에 정보가 없다고 가정합니다. 액세스 제어를 잠그고 걱정할 필요가없는 경우, 맞습니까? 잘못되었습니다. 최소한 순차적 식별자를 공개하는 것은 경쟁 업체가 성장을 추적 할 수있는 좋은 방법을 제공합니다. 순차적 ID를 찾고 성장 예상치를 판매하는 것을 기반으로하는 대규모 산업이 있습니다. –

+0

순차적 ID 대신 UUID를 사용하여 문제를 해결할 수 있으므로 경쟁 업체에 공개하지 않을 것입니다. –

+0

또한 pk & 모델이 포함될 때 각 사용자에게 전송되는 추가 텍스트를 고려하십시오. 이것은 매우 명확하게 저장할 수있는 대역폭입니다 (특히 이것을 모바일 사용자에게 보낼 때). – shaond

3

이전 질문이지만 다른 사람이 Google 검색에서이 질문을 제안 할 것입니다.

불행히도 django 시리얼 라이저는 정의한 것과 같이 사용자 정의가 거의 없습니다. 내 솔루션, 만약 당신이 당신의 프로젝트에 대한 일련의 많은 사용하는 것입니다, 그냥 내 자신의 프로젝트에 장고의 직렬화 물건을 복사하고 몇 가지 작은 변화를했다. 이것은 이상적이지는 않지만 일을합니다. 은 "PK"라인을 제거

self.xml.startElement("object", { 
     "pk" : smart_unicode(obj._get_pk_val()), 
     "model" : smart_unicode(obj._meta), 
    }) 

를 해결해야합니다 특히, PK 년대를 제거하기 위해, start_object에서 선 (OBJ 자기)가있다. 이후에이 기능을 개선하면보기가 일부 변경 될 수 있기 때문에 다소 더러운 해킹이 될 수 있지만 나에게 이는 제한 사항을 해결하는 가장 쉬운 방법입니다.

희망이 있으면 도움이됩니다. 여기에 설명 된대로

7

또한 JSON 시리얼 라이저를 오버라이드 (override) 할 수 있습니다 : Override Django Object Serializer to get rid of specified model

from django.core.serializers.json import Serializer, DjangoJSONEncoder 
from django.utils import simplejson 

import logging 

class MySerializer(Serializer): 
    def end_serialization(self): 
     cleaned_objects = [] 

     for obj in self.objects: 
      del obj['pk'] 
      cleaned_objects.append(obj) 

     simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options) 
+0

감사합니다. 그 질문의 대답은 많은 도움이되었습니다! – Dmitry

0

못생긴 (그러나 작업) 방법 :

data = json.loads(json_string) 

for d in data: 
    del d['pk'] 
    del d['model'] 

data = json.dumps(data) 

: 조쉬했지만 뒤로 무엇

data_tmp = data.split('{') 
#Gets all the data after fields 
response = "[{"+data_tmp[2].replace("}}","}",1) 
8

이 방법을 사용하면 필드를 추가 할 때 코드를 업데이트하는 것에 대해 걱정할 필요가 없습니다. 미래.

1

나는 동일한 문제가있어서 Django의 Serializer로부터 상속받은 Serializer을 만들었습니다. 필드의 데이터 만 필요하므로 get_dump_object 메서드를 덮어 쓰고 PK 필드를 추가했습니다.

from django.core.serializers.json import Serializer 


class JSONSerializer(Serializer): 
    def get_dump_object(self, obj): 
     self._current[obj._meta.pk.name] = obj._get_pk_val() 
     return self._current 

그리고 전화 :

output = JSONSerializer().serialize(queryset) 
이 일에 일을 끝낼 했는가