DRF는 웹 API를 간단하고 유연하게 구축하는 프로세스를 만듭니다. 여러 추가 기능들이 포함되어 있으면 데이터를 직렬화
및 역직렬화
할 수 있도록 잘 설계된 기본 클래스가 함께 제공됩니다.
API에 가장 먼저 필요한 것은 모델 인스턴스를 표현으로 직렬화하는 방법을 제공하는 것입니다.
직렬화는 네트워크를 통해 전송할 수있는 데이터의 스트리밍 가능한 표현을 만드는 프로세스
입니다.역직렬화는 그 반대 프로세스입니다.
모델 인스턴스를 json 표현으로 직렬화 및 역 직렬화하는 직렬화 클래스를 만드는 것을 시작하겠습니다.
polls/serializers.py
파일을 만들게요.
ModelSerializer
를 사용하여 필드 집합을 자동으로 결정하고 create()
및 update()
메서드의 구현을 생성하여 코드 중복을 줄일수 있습니다.
from rest_framework import serializers
from .models import Poll, Choice, Vote
class VoteSerializer(serializers.ModelSerializer):
class Meta:
model = Vote
fields = '__all__'
class ChoiceSerializer(serializers.ModelSerializer):
votes = VoteSerializer(many=True, required=False)
class Meta:
model = Choice
fields = '__all__'
class PollSerializer(serializers.ModelSerializer):
choices = ChoiceSerializer(many=True, read_only=True, required=False)
class Meta:
model = Poll
fields = '__all__'
PollSerializer
in detailclass PollSerializer(serializers.ModelSerializer):
choices = ChoiceSerializer(many=True, read_only=True, required=False)
class Meta:
model = Poll
fields = '__all__'
PollSerializer클래스는 serializers.ModelSerializer
를 상속받음으로써 여러 메서드가 생기게되요.
is_valid(self, ..)
save(self, ..)
create(self, validated_data, ..)
update(self, instance, validated_data, ..)
serializer를 사용하여 poll개체를 만들어 볼게요.
In [1]: from polls.serializers import PollSerializer
In [2]: from polls.models import Poll
In [3]: poll_serializer = PollSerializer(data={"question": "Mojito or Caipirinha?", "created_by": 1})
In [4]: poll_serializer.is_valid()
Out[4]: True
In [5]: poll = poll_serializer.save()
In [6]: poll.pk
Out[6]: 5
위의 poll.pk
은 객체가 DB에 커밋되었는지 알수 있게 하는데요. serializer를 통해서 업데이트도 가능해요.
In [9]: poll_serializer = PollSerializer(instance=poll, data={"question": "Mojito, Caipirinha or margarita?", "created_by": 1})
In [10]: poll_serializer.is_valid()
Out[10]: True
In [11]: poll_serializer.save()
Out[11]: <Poll: Mojito, Caipirinha or margarita?>
In [12]: Poll.objects.get(pk=5).question
Out[12]: 'Mojito, Caipirinha or margarita?'
다음 장에서는 뷰를 작성하기 위해 serializer를 사용할 것입니다.