Skip to content

Django DRF-Serializer #

Find similar titles

1회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    hmkim

Serializer #

  • REST API를 제공하는 장고 애플리케이션은 JSON 데이터를 주고받을 수 있어야 한다. 이를 위해서는 DB 인스턴스를 JSON 데이터로 변환하거나, 반대로 JSON 데이터를 DB 인스턴스로 변환할 수 있어야 한다. 이러한 목적으로 DRF에서 제공하는 클래스가 바로 시리얼라이저이다.

  • 시리얼라이즈 / 디시리얼라이즈 되어야 하는 모델의 필드들이 정의됨

  • ModelSerializer를 사용해 대응하는 모델의 모든 필드, 또는 일부 정의 가능

Serializer 사용 #

  • 시리얼라이저/디시리얼라이저 되어야 하는 필드 정의 필요
  • create(), update() 메소드 정의 필요
  • create(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 생성할 때의 동작 정의
  • update(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 수정하고자 할 때의 동작 정의

Serializer 사용 예 #

    class BoardSerializer(serializers.Serializer):
        #시리얼라이저/디시리얼라이저 되어야 하는 필드들
        id = serializers.IntegerField(read_only=True)
        title = serializers.CharField(allow_blank=True, max_length=100)
        content= serializers.TextField(allow_blank=True, allow_null=True)


    def create(self, validated_data):
        #유효성 검사를 통과한 데이터들을 바탕으로 
        #새로운 DB 인스턴스를 생성하고 반환
        return Board.objects.create(**validated_data):

    def update(self, instance, validated_data):
        # 유효성 검사를 통과한 데이터들을 바탕으로 
        #기존의 DB 인스턴스를 수정하고 반환   
        instance.title = validated_data.get('title', instance.title)
        instance.content = validated_data.get('content', instance.title)

ModelSeriliaer 사용 #

  • Serializer를 만들시, 모델에 기반하여 Seriliazer 필드를 자동으로 만들어줌
  • create(), update() 메소드가 기본으로 제공됨으로, 세부 구현이 필요하지 않다면 정의할 필요가 없음

ModelSerializer 사용 예 #

* 1)class Meta 작성  
    * model = 모델명
    * fields = "__all__" 또는 직접명시

* 2)현재 존재하는 필드 외에 추가하려는 필드가 있을 경우
    * serializer.SerializerMethodField()로 정의 필요

            class BoardModelSerializer(serializers.ModelSerializer):
                 time = serializers.SerializerMethodField()
                 class Meta:    
                 model = Board
                 fields=('id', ‘title', 'content')
                 get_time_of_selected_block(self, object):

View 정의 #

  • Serializer 와 ModelSerializer를 사용하기 위한 veiw 정의
  • safe 는 반환할 데이터 타입이 dict형인지 확인
  • 아래의 예제는 dict형이 아닌 queryset을 반환하기 때문에 safe = False
  • create() 메소드 동작을 위한 view

    def post(self, request, format=None):
        #생성할 인스턴스 내용
        post_serializer =  BoardSerializer(
                                    data = request.data,
                                    context{'user':request.user}
                                )
    
        if post_serializer.is_valid():
            # save()를 통해 serialzier의 create() 메소드 실행, 
            # 새로운 DB 인스턴스 생성
            board =  post_serializer.save()
    
            return JsonResponse(
                post_serializer.data,
                status = status.HTTP_201_CREATED, safe=False)
        return JsonResponse(
            post_serializer.errors, 
            status = status.HTTP_400_BAD_REQUEST, safe=False)
    
  • update() 메소드 동작을 위한 view

    def put(self, request, *args, **kwargs):
        # board = Board.objects.get(pk = kwargs['pk'] )
        board = self.get_object()
    
        #수정할  인스턴스, 수정할 내용
        update_serial  = BoardSerializer(board, data=request.data)
    
        if update_serial.is_valid():
            # save()를 통해 serializer의 update()메소드 실행,
            # DB 인스턴스 업데이트
            update_serial.save()
            return JsonResponse(
                update_serial.data, 
                status = status.HTTP_201_CREATED, safe=False
                )
        return JsonResponse(
            update_serial.errors, 
            status = status.HTTP_400_BAD_REQUEST, safe=False
            )
    

참고 문헌 #

Suggested Pages #

0.0.1_20230725_7_v68