Django serializers

서재환·2022년 9월 6일
0

Django

목록 보기
20/40

serializers

Django Serializer

  • 쿼리셋, 모델, 인스턴스 등의 complex type(복잡한 데이터)를 JSON, XML등의 컨텐트 타입으로 쉽게 변환 해주는 변환기

  • Serializer는 우리가 Django 에서 사용하는 파이썬 객체나 queryset 같은 복잡한 객체들을 REST API에서 사용할 json 과 같은 형태로 변환해주는 어댑터 역할을 한다.

  • 매개인자 data로 받은 데이터의 유효성을 검사하는 작업을 수행한다.

참고자료

Serializers vs ModelSerializers

Serializers

  • the Django rest framework serializer is the normal serializer that will be used when building an API with Django. It simply parses data from complex types into JSON or XML.
  • 직렬화를 행하는 일반 변환기로 복잡한 구조의 데이터를 읽어들여서 그 작업을 수행한다.

ModelSerializers

  • The model serializer is just the same as the above serializer in the sense that it does the same job, only that it builds the serializer based on the model, making the creation of the serializer easier than building it normally.
  • 일반 직렬 변환기와 같은 역할을 수행하지만 Django에서 만든 Model에 대해서 일반 변환기의 사용법 보다 쉬운 방법으로 직렬화 하는 특징이 있다.

참고자료

serializers.Serializer

일반적인 기능을 담당하는 serializer의 흐름을 익히자.

Serializing 과정

models.py

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

serializers.py

from rest_framework import serializers

class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField()
    content = serializers.TextField()
from rest_framework.renderers import JSONRenderer

serializer = ArticleSerializer(Article)
json = JSONRenderer().render(serializer.data)

Deserializing 과정

import io
from rest_framework.parsers import JSONParser

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

serializer = ArticleSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
'''
{ 'title': 'hellow world', 'content': 'big world' }
'''

Serializer DB 생성 및 수정

from rest_framework import serializers

class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField()
    content = serializers.TextField()
    def create(self, validated_data):
        return Article.objects.create(**validated_data)

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

create() 메서드

save() 메서드를 호출함으로 DB 인스턴스를 생성하고자 할 때 정의한다.

update() 메서드

save() 메서드를 호출함으로 DB 인스턴스를 수정하고자 할 때 정의한다.

.save() 사용법

serializer를 만들었으니 serializer.save()를 사용해서 실행하면 된다. 이때 아래와 같이 save에 인자를 추가해서 validated_data의 인수로 포함시키기도 가능하다.

serializer.save(owner=request.user)

예를 들어 .create() 또는 .update()가 호출되면 추가 keyword arguments가 validated_data 인수에 포함된다.

  • serializer = ArticleSerializer(data=data)

    	인자가 하나밖에 없기 때문에 ArticleSerializer 클래스의 create로직이 사용된다.
    
    	create 메서드에 의해 DB에 생성이 된다.
  • serializer = ArticleSerializer(article, data=data)

    인자가 둘이기 때문에 ArticleSerializer 클래스의 update로직이 사용된다.
    article은 models.py에서 정의한 Article의 인스턴트이다.
    
    update로직에 의해 DB 값들이 수정된다.

    참고자료
    참고자료2

serializers.ModelSerialzer

Serializer를 좀 더 간단하게 할 수 있게 도와주는 것

ModelSerializer의 특징

  • 정의할 모델의 필드명만 명시해주면 그것들의 타입에 맞게 시리얼라이저의 필드들이 자동으로 정의가 된다.

  • Serializer를 위한 validator를 제공한다 --> 유효성 검사

  • create()와 update()도 기본적으로 포함되어 있기 때문에 정의할 필요 없다. (추가 기능을 넣으려면 오버 라이딩해서 사용하면 된다. )

ModelSerializer 사용 방법

  1. class Meta 작성
  • model = 모델명
  • fields = all, exclude, 직접 명시 ('id', 'name')
  • read_only_field = ['id']
  1. serializer로 정의해 줘야 되는 필드
  • 추가하고 싶은 필드가 있을 경우, serializer.SerializerMethodField()로 정의해 줌
  • ForeginKey로 연결된 필드가 있을 경우,
    디폴트는 ForeignKey로 연결된 필드의 pk를 가져옴
    만약 해당 데이터의 String이나 Hyperlink 를 가져오고 싶다면 별도로 지정을 해 줘야

0개의 댓글