2014-12-07 1 views
2

POST 메서드에서 객체를 만들고 객체화하면 생성 된 객체의 몇 가지 필드 만 반환하는 방법은 무엇입니까?django-rest-framework 생성 된 객체가 더 적은 수의 필드로 반환됩니다.

다음
def post(self, request, format=None): 
     serializer = SnippetSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

serializer.data는 시리얼에 정의 된 모든 필드를 포함하지만 나는 단지 그들 중 몇 가지를 반환 할이이 문서에서 가져옵니다.

답변

4

잘 나는 여기에 여러 possibilites를 참조하십시오

다음
def post(self, request, format=None): 
     serializer = SnippetSerializer(data=request.data,context={'request': request}) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

시리얼 내부 :

class SnippetSerializer(serializers.IDontKnow): 
    class Meta: 
     model = YourModel 
     fields = ('url', 'field1','field2','field3') 
     write_only_fields =() 
    def __init__(self, *args, **kwargs): 
     super(SnippetSerializer, self).__init__(*args, **kwargs) 
     if self.context != {}: 
      request = self.context['request'] 
      if request.method == 'POST': 
       self.write_only_fields = {'field1':self.fields['field1'], 'field3':self.fields['field3']} 
먼저 (내가 좋아하는)는 다음 시리얼 라이저는 dynamiccly하여 원하는 필드를 선택합니다 시리얼에 요청 객체를 보낼 수있다

이렇게하면 field1 및 field3을 쓸 수있게 만들어야하므로 반환되지 않습니다.

class PostSnippetSerializer(serializers.IDontKnow): 
     class Meta: 
      model = YourModel 
      fields = ('url', 'field1','field2','field3') 
      write_only_fields = ('field1','field3') 

필드 1과 필드 : 당신은 당신이 재곡 할 거예요 해달라고하는 필드를 지정할 수 있습니다

def post(self, request, format=None): 
    serializer = PostSnippetSerializer(data=request.data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

:

둘째, 어쩌면 쉽게 가능성은 포스트 방법에 대해 고유 한 다른 시리얼 라이저를 정의하는 것입니다 3 응답에 반환되지 않습니다

세 번째 방법은 직접보기에서 응답을 작성하는 것입니다.

def post(self, request, format=None): 
     serializer = SnippetSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      results = {'url': serializer.data['url'],'field2':serializer.data['field2']} 
      return Response(results, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

이렇게하면 url과 field2 만 반환되므로 field1과 field3은 저장되지만 반환되지는 않습니다. 같은 질문을 가진 다른 사람들을위한

2

,이 what Tom Christie has said입니다 :

다음 중 하나를

  • 당신이 출력으로 원하지 않는 필드에 write_only = True를 사용하는 것이 좋습니다.
  • 다른 serializer를 사용하여 유효성 검사에 사용하는 응답으로 응답을 반환합니다.
  • 직렬화기를 사용하지 않고 응답 데이터를 직접 반환하십시오.
관련 문제