우선 django-rest-framework 의 serializers.py 를 살펴보도록 하자
class BaseSerializer(Field):
def __init__(self, instance=None, data=empty, **kwargs):
# 생략
class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
# 생략
Serializer
는 BaseSerializer
를 상속받고, 생성자는 위와 같습니다. user
instance가 먼저 나온다면 뒤에 data라는 keyword 를 써줄 필요가 없지만, instance 없이 data 파라미터로 넘기기 위해서는 keyword가 꼭 필요합니다.
# 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'}
CommetSerializer
로 Commnet
를 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"}'
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)}
is_valid()
함수를 호출해야됨# 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
create
or update
둘 중하나의 메소드를 사용하여 저장한다.update
를 실행하고, instance를 전달하지 않으면 create
를 실행한다.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__'
create()
,update()
의 간단한 기본 구현이 포함되어 있다.😃 나는 modelserializer
를 이용해서 구현했다!