from rest_framework import serializers from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
classSnippetSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) title = serializers.CharField(required=False, allow_blank=True, max_length=100) code = serializers.CharField(style={'base_template': 'textarea.html'}) linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') defcreate(self, validated_data): """ Create and return a new 'Snippet' instance, given the validated data """ return Snippet.objects.create(**validated_data) defupdate(self, instance, validated_data): """ Update and return an existing 'snippet' instance, given the validated data """ instance.title = validated_data.get('title', instance.title) instance.code = validated_data.get('code', instance.code) instance.linenos = validated_data.get('linenos', instance.linenos) instance.language = validated_data.get('language', instance.language) instance.style = validated_data.get('style', instance.style) instance.save() return instance
serializer 클래스의 첫번째 부분은 serialized / deserialized 될 필드들을 정의합니다.
create() 와 update() 메서드들은,
serializer.save() 가 호출 되었을때에,
어떻게 완성된 인스턴스들이 생성되고 수정될수 있는지 정의 합니다.
Form 클래스와 유사성
Serializer 클래스는 Django Form 클래스와 매우 흡사합니다. 그리고, required, max_length, default 같은 여러 필드들에 유효성 플래그들을 포함하고 있습니다.
필드 플래그들은, 어떻게 serializers 가 특정 상황속에서 출력되어야 하는지 제어합니다. 플래그는 Django Form 클래스에서 사용하는 widget=widgets.Textarea 와 같습니다. 이는, 특별히 어떻게 브라우저로 볼수 있는 API 가 표시되어야 하는지 제어해야 할때 유용합니다. 이 부분에 대해서는 나중에 볼수 있습니다.
우리는 ModelSerializer 클래스를 사용하여, 우리 스스로 저장 동작을 할수도 있습니다만. 이는 나중에 보게 될것입니다. 단지, 지금은, serializer 정의를 어떻게 하는지에 대해서만 명시합니다.