• DRF Blank Error 해결하기

    2021. 5. 11.

    by. Jacob Lee

    728x90

     


     

    Blank Error 해결하기

    비즈니스 로직 부분 중에 생각지도 못했던 부분에서 에러가 발생했는데, 바로 다음 에러였다.

    memo: ["This field may not be blank."]

    말 그대로 요청을 보낸 memo라는 필드가 빈칸이 될 수 없다는 것이다.

     

     

    분명히 모델에 추가해주었는데!?

    하지만 여기서 이상했던 점은 분명히 모델에 blank=True를 추가해주었다는 점이었다.

    이 메모라는 필드가 크롤링 해오는 링크 안의 쓸 수 있는 메모 필드인데, 로직상 URL로 먼저 크롤링해서 POST 하고 PATCH로 여러 필드를 수정하는 방식이기 때문에, 애초부터 메모라는 필드를 입력하지 않아도 에러가 발생하지 않았었다.

     

    그런데 문제는 유저가 작성했던 메모를 삭제하고 빈칸으로 PATCH 하려 할 때 에러가 발생한다는 점이었다.

     

    기존의 model과 serializer는 다음과 같다.

    # Model
    memo = models.CharField(max_length=256, blank=True)
    
    # Serializer
    class LinkBaseSerializer(serializers.ModelSerializer):
        memo = serializers.CharField(required=False)

     

    정답부터 말하자면 serializer에서 allow_blank=True가 설정이 안 돼있는 것이 문제였다.

    Django에서는 View와 Model을 사용하기 때문에 Model에서 필드의 대한 정의를 해주었다면 문제없이 실행되었을 것이다.

     

    하지만 Django REST Framework에서는 View, Serializer, Model 순으로 로직이 작동되기 때문에 validate와 serialize를 하는 serializer에서 required=False 설정은 되어있지만 이미 값이 들어온 상태에서 blank의 대한 옵션은 명시되지 않았기 때문에 serializer field 에러가 raise 된 것이다.

     

    그러므로 model과 serializer가 다음과 같이 수정되어야 한다.

    # Model
    memo = models.CharField(max_length=256, blank=True)
    
    # Serializer
    class LinkBaseSerializer(serializers.ModelSerializer):
        memo = serializers.CharField(required=False, allow_blank=True)

     

    간단하게 작성된 DRF 공식 문서 예제를 보면 더 이해가 쉬워진다.

     

     

    DRF 공식 문서 예제

    # Snippet Model
    class Snippet(models.Model)
    	title = models.CharField(max_length=100, blank=True, default='')
        
        class Meta:
            ordering = ['created']
            
    # Snippet Serializer
    class SnippetSerializer(serializers.Serializer):
        title = serializers.CharField(required=False, allow_blank=True, max_length=100)

     

    위와 같이 공식문서 튜토리얼 1부터 명시된 내용이었다.

    고치고 나니 바보 같았던 실수임을 깨닫고... 다시 한번 기본이 중요함을 깨달았다!

     

     

    Reference

    728x90

    댓글