6.1 Serializer 시작하기

Serializers는 data를 Python data로 변환한 뒤 JSON, XML 등 다른 콘텐츠 유형으로 변환하게 해줍니다. REST framework의 Serializers는 Django의 Form 클래스와 동작이 비슷합니다.

Serializers 사용법

Serializer를 선언해줍니다.(Class)

from rest_framework import serializers

class AnimalSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=10)
    info = serializers.CharField()

Serializer클래스(class)는 BaseSerializer 클래스(class)를 상속 받습니다. BaseSerializer는 최소한의 클래스를 제공하며, 사용자 지정 Serializer를 구현하는데 사용됩니다. 특히 ‘data=’ 인수의 입력에 따라 사용 가능한 메서드가 달라집니다.

기능 ‘data=’ 입력 ‘data=’ 미입력
.is_valid() serializer 검증 가능 불가능
.initial_data 초기 data return 가능 불가능
.validated_data 검증된 후 data return is_valid() 호출 후 사용가능 불가능
.errors 검증 중 발생된 error is_valid() 호출 후 사용가능 불가능
.data serializer를 통해 직렬화된 data return is_valid() 호출 후 사용가능 가능
# Test Data
data = {‘name’: ’Tiger’, ‘info’:'King of the zoo'}
serializer = AnimalSerializer(data)
print(serializer.data)
#{‘name’: ’Tiger’, ‘info’:'King of the zoo'}

print(serializer.is_valid())
#error
#"Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance."

serializer2 = AnimalSerializer(data=data)
print(serializer2.data)
    
print(serializer2.validated_data)
#error
# "You must call `.is_valid()` before accessing `.validated_data`."

serializer2.is_valid()
#true
print(serializer2.validated_data)
#{‘name’: ’Tiger’, ‘info’:'King of the zoo'}

Instances 저장

검증된 데이터를 기반으로 완전한 object instance를 반환하려면 create() 및 update() 메서드 중 하나 또는 둘 다 구현해야합니다.

#serializers.py
from rest_framework import serializers

class AnimalSerializer(serializers.Serializer):

    name = serializers.CharField(max_length=10)
    info = serializers.CharField()

    def create(self, validated_data):
        print('overriding create method')
        validated_data['name'] += '[1]'
        return SerializerTest(**validated_data)
    
    def update(self, instance, validated_data):
        print('overriding update method')
        instance.values['name'] = validated_data.get('name', instance.values['name'])
        instance.values['info'] = validated_data.get('info', instance.values['info'])
        return instance

class SerializerTest():
    def __init__(self,**values):
        self.values = values
# Test Data
data1 = {'name':'Tiger', 'info':'King of the zoo'}
data2 = {'name':'Tiger', 'info':'The cutest animal'}

# create Test
serializer = AnimalSerializer(data=data1)
serializer.is_valid()
animal = serializer.save()
print(animal.values)
#{'name':'Tiger', 'info':'King of the zoo'}

# update Test
serializer2 = AnimalSerializer(post,data=data2)
serializer2.is_valid()
animal2 = serializer2.save()
print(animal.values)
#{'name':'Tiger', 'info':'The cutest animal'}
#update class가 동작하여 기존의 post도 바뀐 것을 확인할 수 있다.
print(animal2.values)
#{'name':'Tiger', 'info':'The cutest animal'}

Validation

validated_data에 액세스하거나, object instance를 저장하기 전에 항상 is_valid()를 호출해야 합니다. 검증 오류가 발생하면 .errors 속성에 error message를 나타내는 dictionary가 포함됩니다.

.is_valid() 메서드는 선택적 raise_exception 플래그를 사용하므로 유효성 검사 오류가 있는 경우 serializer.ValidationError 예외가 발생합니다. 이 예외는 HTTP_400_Bad_Request 응답을 default로 return 합니다.