작성
·
595
0
안녕하세요 수업 잘 듣고 있어요 :)
DRF 시리얼라이저 궁금한 게 있는데..
시리얼라이저에서 update, create, save를 오버라이딩 할 수 있는데, 이게 json으로 들어온 값을 객체로 만들어서 바로 DB에 넣기 위해 존재한다고 보면 맞을까요?
장고는 MVT 모델이잖아요, 프론트엔드를 react로 하게 되면 DRF에서는 M, V만 건들면 될 것 같고
Model을 수정하는 create, update, save 같은 로직은 view단에서 해야할 거 같은데 왜 이게 시리얼라이저에 들어가 있는 지 궁금해요 ㅜㅜ
예를 들어 회원가입 요청이 json, post요청으로 날아오면
View단에서 CreateAPIView의 post 함수 오버라이딩 하면서 시리얼라이즈하면서 객체 A로 만들어주고, 이걸 someModel.objects.create (A)해야할 것 같은데, 이게 왜 serializer 속으로 들어가 있는 지 궁금합니다.
답변 1
0
안녕하세요.
DRF의 Serializer는 정의한 필드에 대한 입력값에 대한 유효성 검사 및 입력값 변환의 책임을 가지고 있습니다.
ModelSerializer는 Serializer의 책임 + 데이터베이스로의 저장의 책임까지 같이 가지고 있습니다.
ModelSerializer에서 유효성 검사를 한 필드 내역을 모두 가지고 있고, 어떤 모델과 관련이 있는 지도 모두 등록이 되어있으니, ModelSerializer에서 .save 를 지원하는 것은 자연스러운 설계입니다. // 장고 기본의 ModelForm도 save 메서드를 지원하고 있습니다. Serializer와 설계철학이 같습니다.
APiView 에서 perform_create 메서드나 perform_update 메서드 기본 구현에서는 serializer.save() 를 호출하고 있죠. View 단에서 Serializer Instance를 Drive하고 있는 상황입니다.
----
ModelSerializer에서 다루지 않는 필드를 저장할려면, ModelSerializer가 아닌, Serializer를 Drive하는 View 단에서 그 필드들에 대한 저장을 요청하는 방식으로 구현합니다.
예를 들어
Post 모델에 title, content 필드 외에 author, ip 필드가 있다면, author와 ip들처럼 말이죠.
author 필드나 ip를 유저로부터 입력받는 것이 아니라, 서버 단에서 자동으로 입력을 해줘야하는 성격의 필드딜입니다.
이때 perform_create 메서드나 perform_update 메서드를 아래와 같이 재정의할 수 있습니다.
author = self.request.user
ip = self.request.META.get('REMOTE_ADDR')
serializer.save(author=author, ip=ip)
---
살펴보시고, 궁금한 점은 이어서 질문 부탁드립니다.
화이팅입니다. :-)