wafflestudio / seminar-2021

2021 Rookies 세미나
47 stars 110 forks source link

Django 과제 2 timefield 관련 문의 #512

Closed kk0in closed 3 years ago

kk0in commented 3 years ago

안녕하세요. request body에서 time을 14:30 와 같은 형식으로 주어도 response에서 14:30:00 으로 나오는 문제가 해결이 안되서 질문을 드립니다.

seminar/model.py 에서는 time = models.TimeField() 와 같이 정의했고, seminar/serializer.py 에서는 time = serializers.TimeField(required=True, input_formats=['%H:%M']) 와 같이 정의했습니다.

이외에도 구글링을 통해 setting에서 TIME_INPUT_FORMATS = ('%H:%M', ) 등을 추가하는 방법을 적용해봤지만 문제 해결이 되지는 않았습니다.

제가 추측하기로는.. serminar/serializer에서 serminar 생성을 담당하는 시리얼라이저 내 create(self, validated_data) 함수에서 seminar = Seminar.objects.create(..., time=validated_data['time'], ...) 을 진행할 때, validated_data['time']는 14:30 와 같은 형식인데, 이것이 모델에 전달되면서 14:30:00으로 전환되는 것 같습니다. (실제 DB에도 이렇게 저장이 됩니다.)

일단 이러한 제 추측이 맞는지 궁금하고, 이것이 맞다면 어떻게 해결을 해야할 지 궁금합니다! model.py에서 time = models.TimeField() 에 옵션으로 포맷을 주는 방법은 구글링 해도 잘 나오지 않아서, 혹시 다른 방법이 있는지, 아니면 모델에 직접적으로 포맷을 설정하는 방법이 있는지 등에 대한 답변을 주시면 감사하겠습니다!

Jhvictor4 commented 3 years ago

모델에 전달하는 값은 구체적일 수록 좋습니다. 결국 데이터니까요.. 그러니 여기서 조작하시기보단 response를 건드는게 맞습니다.

Serializer가 들어오는 값을 validate-field 메소드로 검증하고, 나가는 값은 get-field 메소드로 직렬화를 수행한다는 것을 세미나 영상과 자료에서 여러 번 언급한 바가 있습니다.

response로 나가는 time 값을 strftime 따위의 메소드로 포매팅 처리 해주시면 되겠죠?

ding-young commented 3 years ago

안녕하세요. 시리얼라이저 타임 필드 관련 공식 문서에 다음과 같이 나와 있는데요, image

또한 저희 과제 스펙에서 세미나 시간 외 다른 타임필드마저 디폴트로 특정한 시간 형식을 맞추라는 얘기가 없어서.. setting을 건드리는 대신 해당 시리얼라이저 타임필드에만 1.format = 어쩌구 2.inputformat 어쩌구(이건 이미 해주셨어요 😃) 옵션을 걸어주면 될 것 같습니다.

Jhvictor4 commented 3 years ago

@ding-young 이제 저보다 drf를 잘 아시는 분들이 나오기 시작했네요. 최고입니다..

제 답변 말고 공식문서대로 해주세요!

kk0in commented 3 years ago

@Jhvictor4 @ding-young 답변주셔서 감사합니다! 그런데 @ding-young 이 주신 답변을 참고해서 아래와 같이 수정을 했는데도, 여전히 시간이 14:30:00 처럼 나옵니다 ㅜㅜ 혹시 이렇게만 고치는 것이 아닌가요..? time = serializers.TimeField(required=True, format=['%H:%M'], input_formats=['%H:%M'])

ding-young commented 3 years ago

@kk0in 아 format = ['형식']에서 []을 빼보시겠어요? 저도 왜 굳이 그런지 정확히는 모르나.. (아마 인풋 포맷은 여러 개를 허용해주고 싶어서 []을 쓰도록 한 것 같고 output 형식은 단일해야할 것 같아서 그냥 '~' 이렇게 쓰나.. 하고 추측만 해봤습니다. 공식 문서 예시에도 자세히 보시면 format이랑 inputformat에 형식 적어주는 방식이 그렇게 다르더라구요 ㅜㅜㅋㅋㅋㅋㅋ)

ding-young commented 3 years ago

아 다시보니 문서에도 format은 "a string" inputformats은 "list of strings"이라 적혀 있어요. 저도 요거 때문에 똑같이 적었다가 시간 날렸었어요 :)