Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

jwj3400

[backend] 시리얼라이저 (Django Rest Framework) 본문

코딩/web

[backend] 시리얼라이저 (Django Rest Framework)

jwj3400 2023. 10. 10. 17:18

Django vs DRF(Django Rest Framework)

  • DRF를 사용하면 view와 model사이 serializer를 사용하여 Model에서 꺼낸 데이터를 Queryset의 형태가 아닌 json형태로 데이터를 받아올 수 있음

serialize와 deserialize

  • 시리얼라이즈: DB 인스턴스를 JSON 데이터로 변환
  • 디시리얼라이즈: JSON 데이터를 DB 인스턴스로 변환

 

시리얼라이저 정의

 

  • 시리얼라이저에는 시리얼라이즈/디시리얼라이즈 되어야 하는 모델의 필드들이 정의됨 (모델의 일부필드만 정의 가능)
  • 유효성플래그는 디시리얼라이즈 시 해당 필드의 유효성이 어떻게 검사 되어야 하는지 나타냄
  • 시리얼라이저에는 create() 메소드(DB 인스턴스 생성)와 update() 메소드(DB 인스턴스 수정)를 정의해줘야함
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(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')

    # Serializer.save()를 통해 DB 인스턴스를 생성할 때의 동작 정의
    # 유효성 검사를 통과한 데이터들을 바탕으로 새로운 DB 인스턴스를 생성하고 반환
    def create(self, validated_data):
        return Snippet.objects.create(**validated_data)

    # Serializer.save()를 통해 DB 인스턴스를 수정 때의 동작 정의
    # 유효성 검사를 통과한 데이터들을 바탕으로 기존의 DB 인스턴스를 수정하고 반환
    def update(self, instance, 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 클래스는 주로 다음 두 가지 기능을 수행

  1. 모델 인스턴스를 JSON 데이터로 변환 (직렬화):
    • 모델 인스턴스를 JSON 형식의 데이터로 변환하여 클라이언트에게 전송 가능한 형태로 만듦
    • 이 과정을 "직렬화(serialization)"라고 함
    • 주로 serializer.data를 통해 직렬화된 데이터를 얻을 수 있음
  2. JSON 데이터를 모델 인스턴스로 변환 (역직렬화):
    • 클라이언트가 전송한 JSON 데이터를 받아와서 모델의 인스턴스로 변환
    • 이 과정을 "역직렬화(deserialization)"라고 함
    • 주로 serializer.is_valid() 및 serializer.save() 등을 통해 역직렬화를 수행
from .models import Post
from .serializers import PostSerializer

# JSON 데이터
json_data = {'title': 'New Post', 'content': 'This is a new post.'}

# 역직렬화: JSON 데이터 -> 모델 인스턴스
serializer = PostSerializer(data=json_data)
if serializer.is_valid():
    post_instance = serializer.save()
    print(post_instance)  # 새로운 Post 모델 인스턴스

# 직렬화: 모델 인스턴스 -> JSON 데이터
serializer = PostSerializer(post_instance)
json_result = serializer.data
print(json_result)  # {'title': 'New Post', 'content': 'This is a new post.'}