seminar-2020 icon indicating copy to clipboard operation
seminar-2020 copied to clipboard

request data -> serializer

Open whiteruby02 opened this issue 4 years ago • 3 comments

이전과제까지는 그럭저럭 꾸역꾸역 해내었는데, 이번과제는 화요일에 3-4번을 맞닥드린 이후로 며칠 째 진전이 없습니다ㅠㅠ 이전 과제0, 1 기준으로 벌써 끝내야할 시간인데도 시작조차 못했습니다ㅠㅠ 혼자 해보려고 했는데 약간의 번아웃과 멘붕에 빠져 제출기한을 맞추지 못할 것 같아 조금 조언을 구하고자 합니다ㅠ

이전 세미나에서 다룬 내용들은 모두 숙지하였습니다. 관련 링크들도 읽어보고, 수업도 열심히 들었습니다. 다만 데이터 간의 관계 같은건 어느정도 이해하였는데, 과제에서 어떻게 구현해야할지를 모르겠습니다...

일단 첫 갈피를 잡지 못하였으나 #181 를 통해 serializer를 이용할 수 있다는 답변을 보고 이전 serializer issue(#162 )를 읽고, 이용하면 되겠다고 생각했습니다. 제가 이해한 바로는 serializer는 python data->Json으로 하는 것이고, deserializer는 Json->python data 입니다. db가 있다면 그 db를 어떻게 response body에 보여주느냐를 하는 것이 serializer.py에서 하는 것이라고 이해했습니다. (처음에는 serializermethodfield와 os_name=serializer.CharField() 등을 이용하여 4번의 response body의 participant(university, accepted)와 Instructor(company, year)를 만들면 되겠다고 생각했으나 serializer는 db에 아무런 영향을 미치지 못하고 db의 데이터를 Json으로 가공해 보여주는 것이라는 걸 깨닫고 model을 고쳐야 겠다고 생각했습니다.) 4번의 response body를 구현하려면 Model의 participantprofile 모델에 university, accepted와 InstructorProfile에 company, year를 추가하고, participantserializer를 serializer.py에 구현하여, 그 클래스 아래에 seminar.serializermethodField를 추가하여, seminarserializer를 participantserializer 아래에 정의하여 필요한 정보를 불러와야겠다고 생각했습니다.

현재 부딪힌 문제는 post 로 들어오는 data를 어떻게 받아 db에 저장하여 serializer로 나타낼까입니다. 제 생각에는 view.py 에서 def create를 수정하여 여기서 request.data.get[role] == 'participant' part = ParticipantProfile(university = request.data.get[university]) 이렇게 ParticipantProfile을 만들어야 한다고 생각하였습니다만 이럴 경우, serializer.py에서 UserSerializer에서 participant = serializer.serializermethodField() 의 participant로 어떻게 넘겨야할지? 모르겠습니다. 그렇다고 srializer.py 파일에서 part를 만들면 participant = serializer.serializermethodField()에 바로 넣을 수는 있지만 request의 data를 가져오지 못해 university 정보를 가져오지 못합니다....

그리고 더불어 과제를 하면서 뼈대코드에서 회원가입 api에서 response body에서 받아오는 정보들을 db(user)에 저장하는 코드를 찾지 못하였는데, 어떻게하는지 의문이 들었습니다...

whiteruby02 avatar Sep 25 '20 08:09 whiteruby02

serializermethodField 같은 경우 get_<Field_Name> method를 정의하여 적절한 값을 return시켜주면, 해당 return 값이 해당 field에 들어갑니다!

공식 문서 : https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

just-dodo avatar Sep 25 '20 09:09 just-dodo

저의 경우 serializer.save() 혹은 {Model}.objects.create()로 DB에 데이터를 입력했습니다. 저의 경우 과제 수행할 때 이미 만들어져있는 코드(Survey, User)를 참고했더니 과제를 "해결"하는 데에는 큰 도움을 받았었습니다.

ghost avatar Sep 25 '20 09:09 ghost

views.py에서 def create를 수정하여, request.data.get[role]=='participant'나 instructor로 여기서 결정하되, participantserializer의 def create를 커스터마이징해서 여기서 participantprofile을 생성하는 식으로 설명들었습니다!

whiteruby02 avatar Sep 28 '20 05:09 whiteruby02