쿼리셋, 모델, 인스턴스 등의 complex type(복잡한 데이터)를 JSON, XML등의 컨텐트 타입으로 쉽게 변환 해주는 변환기
Serializer는 우리가 Django 에서 사용하는 파이썬 객체나 queryset 같은 복잡한 객체들을 REST API에서 사용할 json 과 같은 형태로 변환해주는 어댑터 역할을 한다.
매개인자 data로 받은 데이터의 유효성을 검사하는 작업을 수행한다.
일반적인 기능을 담당하는 serializer의 흐름을 익히자.
models.py
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
serializers.py
from rest_framework import serializers
class ArticleSerializer(serializers.Serializer):
title = serializers.CharField()
content = serializers.TextField()
from rest_framework.renderers import JSONRenderer
serializer = ArticleSerializer(Article)
json = JSONRenderer().render(serializer.data)
import io
from rest_framework.parsers import JSONParser
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
serializer = ArticleSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
'''
{ 'title': 'hellow world', 'content': 'big world' }
'''
from rest_framework import serializers
class ArticleSerializer(serializers.Serializer):
title = serializers.CharField()
content = serializers.TextField()
def create(self, validated_data):
return Article.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.content = validated_data.get('content', instance.content)
instance.save()
return instance
save() 메서드를 호출함으로 DB 인스턴스를 생성하고자 할 때 정의한다.
save() 메서드를 호출함으로 DB 인스턴스를 수정하고자 할 때 정의한다.
serializer를 만들었으니 serializer.save()를 사용해서 실행하면 된다. 이때 아래와 같이 save에 인자를 추가해서 validated_data의 인수로 포함시키기도 가능하다.
serializer.save(owner=request.user)
예를 들어 .create() 또는 .update()가 호출되면 추가 keyword arguments가 validated_data 인수에 포함된다.
serializer = ArticleSerializer(data=data)
인자가 하나밖에 없기 때문에 ArticleSerializer 클래스의 create로직이 사용된다.
create 메서드에 의해 DB에 생성이 된다.
serializer = ArticleSerializer(article, data=data)
인자가 둘이기 때문에 ArticleSerializer 클래스의 update로직이 사용된다.
article은 models.py에서 정의한 Article의 인스턴트이다.
update로직에 의해 DB 값들이 수정된다.
Serializer를 좀 더 간단하게 할 수 있게 도와주는 것
정의할 모델의 필드명만 명시해주면 그것들의 타입에 맞게 시리얼라이저의 필드들이 자동으로 정의가 된다.
Serializer를 위한 validator를 제공한다 --> 유효성 검사
create()와 update()도 기본적으로 포함되어 있기 때문에 정의할 필요 없다. (추가 기능을 넣으려면 오버 라이딩해서 사용하면 된다. )