사전적 의미로는 '직렬화'이다.
내가 만든 모델로부터 뽑은 queryset, 즉 인스턴스를 JSON타입으로 바꾸는 것이다.
간단히, Django모델을 JSON으로 변환하는 틀로 이해하면 됨
DRF내 데이터를 저장 할때에는 Django의 모델을 통해 저장한다.
모델은 DB TBL을 추상화한 개념이며 Django의 ORM을 통해 파이썬으로 데이터를 처리할 수 있었다. 따라서 Django에서의 데이터는 python객체 형태로 저장이 된다.
우리가 만든 API는 이러한 데이터를 client에게 전송하는 역할을 하는데 가공작업을 거치지 않고 보내 준다면 client는 읽지도 못하는 python 데이터를 받게 될 것이다. 따라서 우리는 client가 읽을 수 있도록 문자열로 변환을 해줘야 하는데 이 것을 Serialize라고 한다.
API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘이다. 예를 들어, 기상청의 소프트웨어 시스템에는 일일 기상 데이터가 들어 있다. 휴대폰의 날씨 앱은 API를 통해 이 시스템과 ‘대화’하여 휴대폰에 매일 최신 날씨 정보를 표시한다
API는 웹,앱과 같은 다양한 플랫폼 백엔드 서비스를 위해 JSON과 같은 규격화된 데이터를 제공한다.
즉, DRF를 이용하면 JSON과 같은 양식으로 다양한 플랫폼의 클라이언트에게 데이터를 제공해 줄 수 있는 API 서버가 만들어 진다.
●JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식
●Javascript에서 객체를 만들 때 사용하는 표현식을 의미한다.
●JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다.
●JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다.
●서버와 클라이언트 간의 교류에서 일반적으로 많이 사용된다.
●자바스크립트 객체 표기법과 아주 유사하다.
●자바스크립트를 이용하여 JSON 형식의 문서를 쉽게 자바스크립트 객체로 변환할 수 있는 이점이 있다.
●JSON 문서 형식은 자바스크립트 객체의 형식을 기반으로 만들어졌다.
●자바스크립트의 문법과 굉장히 유사하지만 텍스트 형식일 뿐이다.
●다른 프로그래밍 언어를 이용해서도 쉽게 만들 수 있다.
●특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공한다.
Get은 서버에서 어떤 데이터를 가져와서 보여줄 때 사용한다. 어떤 값이나 내용, 상태 등을 바꾸지 않는 경우에 사용을 하는 것이다.
이에 비해, Post는 서버상의 데이터 값이나 상태를 바꾸기 위해서 사용한다.
게시판으로 예를 들자면, 글의 내용에 대한 목록을 보여주는 경우나, 글의 내용을 보는 경우는 Get에 해당한다.
즉 글 내용을 저장, 수정 할 때는 POST이용한다
GET method는 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드이다.
POSTmethod는 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 데 사용됩니다.
todo/models
from django.db import models
# Create your models here.
class Todo(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(blank=True)
created = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
important = models.BooleanField(default=False)
def __str__(self):
return self.title
todo/serializers.py
from rest_framework import serializers
from .models import Todo
class TodoSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields =('id', 'title', 'complete', 'important')
class TodoDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields =('id', 'title', 'description', 'created', 'complete', 'important')
class TodoCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ('title', 'description','important')
todo/urls.py
from django.urls import path
from .views import TodosAPIView,TodoAPIView,DoneTodoAPIView,DoneTodosAPIView
urlpatterns = [
path('todo/',TodosAPIView.as_view()),
path('todo/<int:pk>',TodoAPIView.as_view()),
path('done/', DoneTodosAPIView.as_view()),
path('done/<int:pk>/',DoneTodoAPIView.as_view()),
]
todo/views.py
from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSimpleSerializer, TodoDetailSerializer, TodoCreateSerializer
class TodosAPIView(APIView):
def get(self, request):
todos = Todo.objects.filter(complete=False)
serializer =TodoSimpleSerializer(todos,many=True)
return Response(serializer.data,status=status.HTTP_200_OK)
def post(self, request):
serializer=TodoCreateSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class TodoAPIView(APIView):
def get(self, request, pk):
todo =get_object_or_404(Todo, id=pk)
serializer =TodoDetailSerializer(todo)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, pk):
todo = get_object_or_404(Todo, id=pk)
serializer =TodoCreateSerializer(todo, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class DoneTodosAPIView(APIView):
def get(self, request):
dones = Todo.objects.filter(complete=True)
serializer = TodoSimpleSerializer(dones, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class DoneTodoAPIView(APIView):
def get(self, request, pk):
done=get_object_or_404(Todo, id=pk)
done.complete = True
done.save()
serializer = TodoDetailSerializer(done)
return Response(status=status.HTTP_200_OK)
todo/admin.py
from django.contrib import admin
from .models import Todo
# Register your models here.
admin.site.register(Todo)