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로는 일부 정보만 받고, 나머지 정보는 서버에서 채우고 싶다면 다음 과정을 거친다.
- serializer의 fields 에서 받지 않을 필드를 뺀다.
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)