DRF 4 - Serializer - Validator (News api 4편)

Joey Lee·2020년 7월 9일
2

Django REST Framework

목록 보기
5/16

클라이언트에서 전달된 데이터를 DB에 저장하기 전에 .is_valid() 메소드를 통해 데이터 유효성 검사를 진행하게 됩니다. REST 프레임워크에서는 기본적인 유효성 검사는 디폴트로 제공이 됩니다. 가령, EmailField일 경우, @가 포함되어 있지 않으면 validation error가 발생하는데, 아래가 그 사례라고 할 수 있습니다.

serializer = ContactSerializer(data={'body': 'some text', 'email': 'name#gmail.com'})
serializer.is_valid()
# False

serializer.errors
# {'email': [u'Enter a valid e-mail address.']}

이 외에도 tutorial을 살펴보면 uniguetoghter validation 등 기본적으로 제공되는 validator들을 확인할 수 있습니다. 만약, 기본으로 제공되는 validator 외에 자기만의 validator 메소드를 만들고 싶다면 아래 사례와 같이 만들면 됩니다. 크게 Validator는 instance 전체에 적용되는 object-level과 field 단위로 적용되는 field-level validator가 있습니다.

1. Customized Validator 작성

class ArticleSerializer(serializers.Serializer):

.....

# Object-level validation
def validate(self, data):
        """ check that description and title are different """

     if data['title'] == data['description']:
        raise serializers.ValidationError("Title and Description must be different")
    return data
    
# Field-level validation
def validate_title(self, value):
    if len(value) < 60:
        raise serializers.ValidationError("Title should be less than 60 characters")

2. 에러 메시지

1) 에러메시지 : title과 description 일치 시

POST /api/articles/
HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "non_field_errors": [
        "Title and Description must be different"
    ]
}

2) 에러메시지 : 타이틀 60자 미만일 때 에러 시

HTTP 400 Bad Request
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "title": [
        "Title should be less than 60 characters"
    ]
}
profile
안녕하세요!

1개의 댓글

comment-user-thumbnail
2020년 12월 17일

Validator 커스텀 공부에 많은 도움이 됐습니다! 감사합니다 ~

답글 달기