DRF Serializer

Posted on 2021-08-30 by GKSRUDTN99
Django Rest Framework DRF Serializer

ModelSerializer의 예시 코드를 살펴보자

class StylistSerializer(serializers.ModelSerializer):
    class Meta:
        model = Stylist
        # exclude = ['user', 'confirmation_status', 'view_count', 'avg_rating', 'rating_count', 'like_count', ]
        fields = '__all__'
        read_only_fields = ['user', 'confirmation_status', 'view_count', 'avg_rating', 'rating_count', 'like_count', ]

class Meta model = Stylist

이 Serializer가 어떤 model을 기반흐로 하는지 지정한다.

exclude = [...]

model의 필드들 중, required=False이며, read_only=True인 필드들을 지정할 수 있다.

fields = '__all__

model의 필드들 중, 어떤 필드들을 사용할 것인지 지정한다.
exlude와 fields 둘 중 하나를 선택하여 사용할 수 있다.

read_only_fields = [...]

required=True이지만, read_only=True인 필드들을 지정한다. 레코드를 생성할 때는 입력을 받지만, 그 뒤에 update는 불가능하다.


serializer = self.get_serializer(data=request.data)와 같은 형식으로 Serializer 객체를 생성한다.

serializer.save()serializer.is_valid()를 호출한 뒤에 호출이 가능하다.

만약 request로는 일부 정보만 받고, 나머지 정보는 서버에서 채우고 싶다면 다음 과정을 거친다.

  1. serializer의 fields 에서 받지 않을 필드를 뺀다.
  2. serializer.save(user=self.request.user)와 같이 save()의 parameter로 추가하고 싶은 필드를 추가한다.

여러 객체의 정보를 serializer를 통해 담고 싶다면 다음과 같이 작성할 수 있다.

serializer = self.get_serializer(instances, many=True)

대신, 위와 같이 호출하였을 시에는 입력을 받은 데이터가 없으므로, is_valid()는 호출할 수 없다. 활용 예시는 다음과 같다.

@action(detail=False, methods=['GET'], name='null_requests')
    def null_requests(self, request):
        stylists = Stylist.objects.filter(user=self.request.user)
        if stylists.count() != 0:
            requests = Request.objects.filter(stylist=None)
            serializer = self.get_serializer(requests, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response("Not Authenticated", status=status.HTTP_401_UNAUTHORIZED)