seminar-2020
seminar-2020 copied to clipboard
booleanfield에서 must be valid boolean error
POST /api/v1/seminar/
를 테스트하는 중인데 Fail에 발생해서 확인해보니 online이 valid boolean이어야 한다는 에러가 출력되더라구요!
그런데 위의 코드에서 print(type(seminar.online))
으로 찍어 보았을 때 type이 boolean으로 찍히는 것을 확인할 수 있었습니다. 코드 상 online에 True or False 중 하나는 반드시 들어가게 되구요...! print가 작동하는 것으로 보아 serializer.is_valid에서 이러한 에러가 발생하는 것 같은데 혹시 이러한 오류가 발생하는 이유가 무엇일까요? 구글링 해도 답을 찾지 못해 질문 드립니다:disappointed_relieved:
models.py
내에서는 online = models.BooleanField(default=True)
이렇게 설정이 되어 있습니다. serializers.py
에서는 별도의 online을 구성하지 않고 class Meta 안에서 처리됩니다.
serializer에서 online에 default=True걸어보시겠어요?
@eldpswp99 수정해서 이렇게 걸었는데 결과는 같게 나옵니다:sob:
online 부분은 이렇게 작성되어 있습니다
online부분이라는 것이 validate_online인가요?
@eldpswp99 아뇨 views.py
에서 SeminarViewSet
내부의 create
함수 내에서 request로 받은 online을 말하는 거였습니다! create
내에서 online을 체크해주었는데 validate_online을 통해 확인해 주어야 할까요?
@yuri-0415 아뇨 로직이 뷰에서 처리하도록 하신거면 굳이 바꾸실 필요는 없어 보입니다. serializer에서 is_valid를 호출하신 이유를 알 수 있을까요? save를 호출하지 않으셨는데, save를 호출하기 위해서가 아니라면 is_valid를 굳이 호출하실 필요가 없고, data를 줄 필요도 없어 보입니다. post인거로 보아서 update도 아닌 것 같은데, partial=True도 필요없어 보이구요. 관련 이슈로는 #179 ,#180 이 있습니다.
그리고 제가 앞서 말씀드렸던 serializer에 default=True는 안하셔도 될 것 같습니다. 제가 serializer로 create로직을 짜셨다고 착각을 했네요 ㅠ
- 혹시 테스트 로직에 trUE와 같은 상황을 테스트 하는 것이 있나요? serailizer에서 booleanfield는
TRUE_VALUES = { 't', 'T', 'y', 'Y', 'yes', 'YES', 'true', 'True', 'TRUE', 'on', 'On', 'ON', '1', 1, True } FALSE_VALUES = { 'f', 'F', 'n', 'N', 'no', 'NO', 'false', 'False', 'FALSE', 'off', 'Off', 'OFF', '0', 0, 0.0, False }
에 따라 validation을 실행하게 됩니다.
#183 에 다빈님이
serializers.BooleanField가
TRUE_VALUES, FALSE_VALUES로 취급하는 것들 정도만 고려하시면 됩니다!
라고 언급하셨던 것으로 보아 저기에 맞게 테스트 작성하시면 될 것 같습니다.
@eldpswp99 아하 그렇군요...! 이전 이슈를 더 꼼꼼히 확인해야겠네요:smiley: 감사드립니다!!!