인프런 커뮤니티 질문&답변

Han Kim님의 프로필 이미지
Han Kim

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

안녕하세요! 선생님 serializer return에 대해서 질문드립니다!!

작성

·

236

0

안녕하세요!!! serializer return 값에 대해서 질문드리려고합니다!! ㅎㅎ
 
저의 post 모델중 아래 필드가 하나있습니다!!
video = models.FileField(upload_to='videos/%Y/%m/%d', null=True, blank=True)
 
이를 serializer하여 리턴하려 하는데 위에 보이시다시피 null 값이 허용이 됩니다!
 
하지만 프론트엔트 개발자가 null값일 경우에는 뭐라도 리턴값을 아무거나라도 해달라고 해서 (처리하기 번거롭다고해서 ;;)
아래와 같이 serializermethod를 따로 만들어서 -> videos = serializers.SerializerMethodField('get_video')
만일 video필드에 아무것도 넣지않은 null 요청일경우는
 
return {'detail': "비디오가 없습니다."}
 
요론식으로 리턴하려 하고
 
만일 video가 있으면?
즉 video를 넣어 post 요청을하면 video필드의 fullurl? path? 를 respone로 리턴하려고 하는데 (일반적인 serializer 응답처럼용~~) upload_to 의 경로가 걸려있다보니깐 fullpath를 딱 구해지지가 않네요...
 
print(request.build_absolute_uri(post.video.url)) 이런식으로 출력하면 오늘년도날짜가 제외된 url이 나옵니다
 
-> http://127.0.0.1:8000/media/%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4!
위와 같은 식으로 나옵니다 실제 저장된 경로는 media뒤에 videos/년/월/일이 있어야 하는데 말이죵;;
 
 
사실 궁극적인 목적으로는 null값에 대한 아무값이나 리턴을 원하는데 위는 제가 생각한 방식이고 제 생각에는 더 쉽고 정석적인 방법 있을것 같으나 찾지 못해서 위와 같이 흙수저씩 코딩을 하고 있네요 ..ㅠㅠ
 
분명 null에 대한 좀더 효과적인 처리방법이나 아니면 한방에 url 받아오면 메소드가 있을것같은데
아직 모르는게 많아서 찾기가 어렵네요 ~
 
더 명확하고 정석적인 방법으로 안내 해주시면 정말 감사하겠습니다!!!!!!!!!!!!!!!!!!!!!!
항상 정말 감사합니다 !!!!
 
 
 
 
 
 
 

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

값이 없다면 null로서 응답을 주는 것이 보다 정확한 API 응답입니다. 임의의 어떤 값으로 지정을 하실려는 것인지는 모르겠으나, 그리 좋은 접근은 아닙니다.

조회 요청에서 video 필드의 값을 표현할 때, null이 아니라 임의의 문자열로 응답을 하고자 하시는 것인지요?

일단 지금 생각나는 방법은 Serializer와 각 Serializer Field에서는 to_representation 메서드가 있습니다. 이는 Serializer가 만들어낸 최종 primitive 데이터입니다. 이를 Response를 통해 응답에 활용됩니다. to_representation 메서드를 오버라이드하셔서 특정 field의 값이 None일 때, 다른 값으로 변경해보실 수 있습니다. // 디버거를 통해 data 값 내역도 꼭 확인해보세요.

---

그리고 models.FileField/ImageField를 통해 파일이 저장되셨다면, 저장 시점에 upload_to 인자를 통해 저장 경로를 계산해서 저장하게 됩니다.  이미 저장된 파일에 대해서는 upload_to 인자를 수정하는 것은 영향을 끼치지 않습니다. 지정 경로에 다시 저장코자한다면, 다시 save 과정을 거쳐야 합니다. // 필드명.url 만으로 hostname을 제외한 절대경로 URL이 계산이 됩니다.

---

화이팅입니다. :-)

Han Kim님의 프로필 이미지
Han Kim

작성한 질문수

질문하기