TIL DRF

손성수·2023년 6월 27일
0

Django Serializer의 Context

def post(self, request, user_id):
        """
        배송 정보 추가
        """

        user = get_object_or_404(User, id=user_id)
        validated_result = ValidatedData.validated_deliveries(user, request)
        if validated_result is not True:
            return Response(
                {"err": "유효성 검사 실패"}, status=validated_result
            )

        serializer = DeliverySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=user)
            return Response(
                {"msg": "배송 정보가 등록되었습니다."}, status=status.HTTP_200_OK
            )
        else:
            return Response(
                {"err": serializer.errors}, status=status.HTTP_422_UNPROCESSABLE_ENTITY
            )
  • 기존의 코드는 배송정보의 유효성 검사에서 user 데이터 정보도 검증을 해야 했기에
    serializer에서 데이터를 검증하지 못하고 view 함수에서 데이터를 검증하고 있었다.

user = get_object_or_404(User, pk=request.user.pk)
        serializer = DeliverySerializer(data=request.data, context={'user': request.user})
        if serializer.is_valid():
            serializer.save(user=user)
            return Response(
                {"msg": "배송 정보가 등록되었습니다."}, status=status.HTTP_200_OK
            )
        else:
            return Response(
                {"err": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
            )
  • serializer의 context로 key, value 쌍으로 데이터를 넘겨 줌으로써
class DeliverySerializer(serializers.ModelSerializer):
    """
    배송 정보 저장  및 업데이트
    """

    class Meta:
        model = Delivery
        exclude = ('user',)

    def validate(self, deliveries_data):
        """
        우편 번호 검증
        """

        validated_result = ValidatedData.validated_deliveries(self.context.get('user'), deliveries_data)
        if validated_result is not True:
            raise ValidationError(validated_result[1])
        return deliveries_data
  • serialier의 validate에서 데이터를 검증할 수 있게 되었다.

context를 이용하여 다양한 정보를 넘겨줄 수도 있다.

profile
더 노력하겠습니다

0개의 댓글