[DRF] Serializer 모드

Jinhyung Rhee·2022년 8월 13일
0

RetrieveAPIView

  • READ 오퍼레이션 수행
    • instance = self.get_object() : 테이블로부터 instance 가져옴
    • serializer = self.get_serializer(instance) : 가져온 데이터(instance)를 serializer의 instance 인자에 넣음
    • serializer.data : 직렬화의 결과가 담겨있는 데이터(dict 자료형)
    • Response(serializer.data) : Response 클래스에서 JSONRenderer().render(~) 메서드를 호출해서 ByteString으로 만들고 이를 client에게 응답함!

CreateAPIView

  • WRITE 오퍼레이션 수행
    • request.data : client로부터 받은 데이터
    • serializer = self.get_serializer(data=request.data) : client로부터 받은 데이터를 serializer의 data 인자에 넣음
    • serializer.is_valid(raise_exception=True) : 유효성 검사를 필수적으로 수행!
    • self.perform_create(serializer) : instance를 생성하고 DB에 저장하는 기능 수행⭐
      -> serializer의 save 메서드를 호출
      - ModelSerializer의 save 코드 참고👇
      -> if self.instance is not None: ~ : self.instance가 있으면 update()메서드 호출
      -> else: ~ : self.instance가 없으면 create()메서드 호출
      -> ⭐ self.instance가 있고 없고는 View(CreateView vs UpdateView)에서 Serializer를 호출할 때 결정됨⭐
      -> serializer = self.get_serializer(instance, data=request.data, partial=partial) : UpdateAPIView에서는 serializer를 호출할 때, instance 인자를 넣어주고 있음!⭕
      -> 즉, DB에서 가져온 instance(= update 처리대상인 instance)를 serializer에 넣어주고 있음!
      -> serializer = self.get_serializer(data=request.data) : 반면 CreateAPIView에서는 serializer를 호출할 때, instance 인자를 넣어주고 있지 않음!❌
      -> 즉, 새로운 instance를 생성하는 과정이기 때문에, DB에서 instance를 가져오는 과정이 없음!
      - ModelSerializer의 create 코드 참고👇
      -> 이렇게 내부적으로 유효성 검사를 통과한 데이터(validated_data)로 instance를 생성하고 DB에 저장하고 있음!
      -> (Comment 테이블 예시에서 두 코드는 동일함)
      ModelClass._default_manager.create(**validated_data
      ==
      Comment.objects.create(**validated_data)

Reference

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-drf/dashboard

profile
기록하는 습관

0개의 댓글