serializer에서 validate 함수를 선언하면 validator를 커스텀 할 수 있다. custom validator는 기본 validator가 동작한 후에 동작한다. 기본 validator는 데이터의 required, invalid 같은 데이터베이스의 형식 등을 판단하고 custom validator에서는 원하는 validation을 추가로 검증할 수 있다.
validate 함수에서 유효성 검증에 실패하면 raise serializers.ValidationError를 이용해서 에러 메세지를 보내준다. 그리고 유효성 검증이 통과되면 데이터를 리턴한다.
아래는 예시이다.
class ProductSerializer(serializers.ModelSerializer):
def validate(self, data):
if data.get('end_date') and data.get('end_date') < timezone.now().date():
raise serializers.ValidationError(
# custom validation error message
detail={"error": "종료 일자는 과거일 수 없습니다."},
)
return data
serializer에서 create 함수를 선언하면 creator를 커스텀 할 수 있다. custom creator는 validator와 달리 기본 creator는 동작하지 않는다. 기본 creator와 같이 유효성 검증을 통과하지 않으면 저장되지 않는다. 그리고 저장한 객체를 리턴해야 한다.
class ProductSerializer(serializers.ModelSerializer):
def create(self, validated_data):
desc = validated_data.pop('desc') + f'\n{timezone.now().date()}에 등록된 상품입니다.'
validated_data['desc'] = desc
product = Product(**validated_data)
product.save()
return product
serializer에서 update함수를 선언하면 updater를 커스텀 할 수 있다. custom creator처럼 custom updater를 사용하게 되면 기본 updater는 동작하지 않는다. instance는 입력한 오브젝트, 즉 수정할 객체가 담긴다. validated_data는 수정할 데이터이다.
class ProductSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data):
for key, value in validated_data.items():
if key == 'desc':
value = f'{timezone.now()}에 수정되었습니다.\n' + value
setattr(instance, key, value)
instance.save()
return instance