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