2016-11-16 4 views
0

끝점에 전달되는 복잡한 JSON 데이터 구조를 구문 분석하기 위해 DRF에 사용자 지정 serializer를 작성하는 방법을 파악하는 데 어려움을 겪고 있습니다. json으로는 다음과 같습니다Django Rest Framework : Custom JSON Serializer

# views.py 
class SaveData(views.APIView): 
    def post(self, request, *args, **kwargs): 
     name = request.POST.get('name') 
     site = request.POST.get('site') 
     data = request.POST.get('data') 

그러나 data 항상 None를 반환

{ 
    "name": "new", 
    "site": "US", 
    "data": { 
     "settings": [], 
     "meta": { 
      "meta1":{} 
     } 
    } 
} 

가 여기 내 백엔드 코드입니다. request 객체로 가까이 검사에서 들어오는 JSON은 다음과 같습니다

# POST attribute of request object 
'name' = 'new' 
'site' = 'US' 
'data[settings][0] = '' 
'data[meta][meta1][] = '' 

은 기본적으로 제대로 파이썬 dictlist 객체로 직렬화하기되지 않은 data 키와 연관된 중첩 된 JSON 객체처럼 보인다. 나는 커스텀 DRF 시리얼 라이저의 예제를 찾고 있었지만, 발견 한 것들 중 대부분은 장고 모델을 직렬화하기위한 것이었지만 그렇게 할 필요는 없다. 들어오는 데이터가 내 모델에 직접 매핑되지 않습니다. 대신 데이터를 저장하기 전에 일부 처리를 수행해야합니다.

data JSON을 적절한 Python 개체로 올바르게 변환하는 사용자 지정 serializer에 대한 조언이 있습니까? 나는 이것으로 시작했지만 예외 (When a serializer is passed a 'data' keyword argument you must call '.is_valid()' before attempting to access the serialized '.data' representation. You should either call '.is_valid()' first, or access '.initial_data' instead.)를 throw합니다. 다음은 생성 한 사용자 지정 serializer에 대한 코드입니다.

# serializers.py 
class SaveDataSerializer(serializers.Serializer): 
    name = serializers.CharField() 
    site = serializers.CharField() 
    data = serializers.DictField() 

    def create(self, validated_data): 
     return dict(**validated_data) 

감사합니다.

답변

0

$.ajax에 전달할 때 JS 객체를 JSON으로 변환하여 문제를 해결할 수있었습니다. 그러면 DRF가 올바르게 파이썬 객체로 구문 분석 할 수있었습니다. 당신은 아무것도 지정하지 않은 경우 그 jQuery를이 Content-Type으로 x-www-urlencoded로 설정됩니다 불구하고

$.ajax({ 
    url: '/api/endpoint', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify(ajaxData), 
    done: function(data) {} 
    ... 
}) 

참고 : 여기 내가 사용 JQuery와의 조각입니다. JSON.stringify() 메서드를 사용하여 명시 적으로 ajaxData 개체를 JSON 문자열로 변환하므로 Content-Type도 명시 적으로 설정해야합니다.

나는이의 아이디어는 SO 답변을 가지고 : 물론 Convert Object to JSON string

이 정말 내 원래의 질문에 대답하지 않습니다, 그러나 이것은 간단하고 내가 원하는처럼 작동 다른 솔루션입니다. 이렇게 나는 모든 사용자 정의 시리얼을 만들 필요가 없었어요,하지만 난 그렇게처럼 내 API보기를 수정해야 않았다

class SaveData(views.APIView): 
    def post(self, request, *args, **kwargs): 
     name = request.data.get('name') 
     site = request.data.get('site') 
     data = request.data.get('data') 

를 예상 오브젝트 유형

>>> type(name) 
str 
>>> type(site) 
str 
>>> type(data) 
dict 

을 반환하는이 일을 한 후
관련 문제