DRF의 validation에 대해서 알아보자.
validation은 brandi 인턴기간
에서 flask를 사용하면서 validation 을 따로 관리해줘서 뭔가 좀더 체계적이고, 확장성에 좀 더 좋을꺼같다는 생각을 했었는데. 과연 DRF는 얼마나 다른지 확인해보자
클라이언트에서 전달된 데이터를 DB에 저장하기 전에 .is_valid()
매소드를 통해 데이터 유효성 검사를 기본적으로 진행하게 됩니다.
>>> serializer = UserSerializer(data={'email': 'name#gmail.com', 'password' : '1234'})
>>> serializer.is_valid()
False
>>> serializer.errors
{'email': [ErrorDetail(string='Enter a valid email address.', code='invalid')]}
😃 model.py 에서 emailField를 사용했기 때문에 @가 포함되지 않으면 validation error가 발생합니다.
>>> serializer = UserSerializer(data={'email': 'name@1234.1234', 'password' : '1234'})
>>> serializer.is_valid()
True
>>> serializer.errors
{}
😡 하지만 @의 유무만 판단하고 대부분의 에러핸들링은 안되는것으로 봐서 customized validator 가 필요할꺼같다...
- object-level-validator : instance 전체에 적용
- field-level-validator : field 단위로 적용
Field-level-validation
은 함수명을 정해줄때 validate_{field명}
으로 정의해줘야되며, field 하나에 대해서면 데이터 분석을 하기 때문에 효율적(?) 이라고 생각한다.Object-level-validation
은 기존에 validtor 하던 방식과 비슷하게 attrs['{field명}']
으로 데이터 분석을 하면된다.raise serializers.ValidationError('This email already exists')
를 이용해서 처리해주었고, eamliField 에서는 따로 RegexValidator(pattern,message .. )
형식으로 따로 처리해주었다.
이메일 중복검사 error message
이메일 Validator