serializer를 통한 validate과 create

코변·2022년 6월 21일
0

개발일지

목록 보기
34/41
post-custom-banner

serializer의 커스텀 validate, 커스텀 create를 활용하여 다양한 검증을 시도해보았다.

user = request.user
request.data['author'] = user.id
product_serializer = ProductSerializer(data = request.data)
product_serializer.is_valid(raise_exception=True)
product_serializer.save()
return Response(product_serializer.data, status.HTTP_200_OK)

views.py에서 위와같은 코드로 serializer를 활용하여 간단하게 데이터를 저장할 수 있고 is_valid 함수에 내가 만든 커스텀 validate로직을 추가할 수 있다.

def validate(self, data):
	today = dt.datetime.now(gettz('Asia/Seoul')).date()
    if data.get('exposure_start_date') < today:
    	raise serializers.ValidationError(
        detail= {"error" : "노출 시작일은 오늘부터 가능합니다."}
        )
	return data

위와 같은 코드로 product를 등록할 때 노출시작일이 오늘보다 이전이라면 노출시작일은 오늘부터 가능하다는 에러를 반환하게 하였다.

이와 같이 validate를 활용하면 views.py 내의 함수를 아주 간단하게 줄일 수 있고 validate라는 함수 안에서 조건들을 나열하기 때문에 직관적으로 데이터를 검증하는 로직이 어디에 있고 어떻게 핸들링해야하는지 알 수 있다.

또한 커스텀 create함수를 통해서 db에 데이터를 커스텀하여 저장할 수 있다. 아래와 같이 post로직을 길지않게 가져가면서 연관 필드에 값을 저장할 수 있다.

def create(self, validate_data):
	user_profile = validate_data.pop("userprofile")
    hobbies = user_profile.pop("get_hobbies")
    user = UserModel(**validate_data)
    user.save()
    user_profile = UserProfile.objects.create(user= user, **user_profile)
    user_profile.hobby.add(*hobbies)
    user_profile.save()
    return user
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.
post-custom-banner

0개의 댓글