jwj3400
[backend] 시리얼라이저 (Django Rest Framework) 본문
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 클래스는 주로 다음 두 가지 기능을 수행
- 모델 인스턴스를 JSON 데이터로 변환 (직렬화):
- 모델 인스턴스를 JSON 형식의 데이터로 변환하여 클라이언트에게 전송 가능한 형태로 만듦
- 이 과정을 "직렬화(serialization)"라고 함
- 주로 serializer.data를 통해 직렬화된 데이터를 얻을 수 있음
- 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.'}
'코딩 > web' 카테고리의 다른 글
[server] 네트워크 가상화 (0) | 2024.02.24 |
---|---|
[Frontend] LocalStorage & SessionStorage & Cookie (0) | 2023.10.08 |
[Frontend/Backend] 세션/쿠키 & JWT (0) | 2023.10.07 |
[backend] XSS(Cross Site Scripting) & CSRF (Cross-Site Request Forgery) (0) | 2023.10.06 |
[backend] CORS (Cross-Origin Resource Shari) (0) | 2023.08.25 |