클라이언트에서 전달된 데이터를 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가 있습니다.
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")
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"
]
}
Validator 커스텀 공부에 많은 도움이 됐습니다! 감사합니다 ~