[drf | agiliq] Serializing & Deserializing Data

Serializing & Deserializing Data

DRF는 웹 API를 간단하고 유연하게 구축하는 프로세스를 만듭니다. 여러 추가 기능들이 포함되어 있으면 데이터를 직렬화역직렬화 할 수 있도록 잘 설계된 기본 클래스가 함께 제공됩니다.

Serializing & Deserializing Data

API에 가장 먼저 필요한 것은 모델 인스턴스를 표현으로 직렬화하는 방법을 제공하는 것입니다. 직렬화는 네트워크를 통해 전송할 수있는 데이터의 스트리밍 가능한 표현을 만드는 프로세스입니다. 역직렬화는 그 반대 프로세스입니다.

Creating Serializers

모델 인스턴스를 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__'

The PollSerializer in detail

class 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, ..)

Using the PollSerializer

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를 사용할 것입니다.

좋은 웹페이지 즐겨찾기