[Django] DRF - Serializer

김영환·2021년 3월 18일
1

django rest framework

목록 보기
4/4
post-thumbnail

Serializer

우선 django-rest-framework 의 serializers.py 를 살펴보도록 하자

class BaseSerializer(Field):
    def __init__(self, instance=None, data=empty, **kwargs):
    # 생략

class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
    # 생략

SerializerBaseSerializer를 상속받고, 생성자는 위와 같습니다. user instance가 먼저 나온다면 뒤에 data라는 keyword 를 써줄 필요가 없지만, instance 없이 data 파라미터로 넘기기 위해서는 keyword가 꼭 필요합니다.

Serializing objects

# models.py
from django.db import models

class Comment(models.Model):
	email = EmailField()
    content = CharField(max_length=1000)
    created = DateTimeField()
    
from rest_framework import serializers

#serializers.py
class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

>> serializer = CommentSerializer(comment)
>> serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
  • CommetSerializerCommnet 를 serialize 할 수 있습니다.
  • 모델 인스턴스를 파이썬 내부 데이터 타입으로 출력한 결과
from rest_framework.renderers import JSONRenderer

json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'
  • python datatype에서 JSON으로 출력하기 위해서는 위와 같이 랜더링을 거쳐야된다.

Deserializing objects

import io
from rest_framework.parsers import JSONParser

stream = io.BytesIO(json)
data = JSONParser().parse(stream)

serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
  • deserializing 한 데이터는 항상 is_valid() 함수를 호출해야됨

Saving instances

# serializers.py
# 생략..
def create(self, validated_data):
        return Comment.objects.create(**validated_data)

def update(self, instance, validated_data):
      instance.email = validated_data.get('email', instance.email)
      instance.content = validated_data.get('content', instance.content)
      instance.created = validated_data.get('created', instance.created)
      instance.save()
      return instance

# views.py
comment = serializer.save()

# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

serializer.is_valid()
>> False
serializer.errors
  • model에 저장하기위해서 create or update 둘 중하나의 메소드를 사용하여 저장한다.
  • serializer에 instance를 전달하면 update를 실행하고, instance를 전달하지 않으면 create를 실행한다.

ModelSerializer

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

# '__all__' attribute 이용
class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = '__all__'
  • 모델에 따라 자동으로 필드 세트가 생성된다
  • serializer에 대한 유효성 검사기를 자동으로 생성한다.
  • create(),update() 의 간단한 기본 구현이 포함되어 있다.

😃 나는 modelserializer를 이용해서 구현했다!

0개의 댓글