10주차 3일 TIL

서정인·2022년 6월 23일
0

custom validator

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

custom creator

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
 

custom updater

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
profile
코딩공부

0개의 댓글