-
TIL.58 Django Rest Framework_serializer(직렬화)TIL/Django 2020. 12. 6. 23:43728x90
클라이언트의 Request(요청)에 대한 Response(응답)을 백엔드서버에서 보내줘야한다.
이러한 Http 통신은 이전에는 XML(Extensible Markup Language) 형식을 사용하였었다.
하지만 XML은 장황하고 복잡하였으며, 많은 태그들과 문자량이 늘어나 응답시간이 느린 무거운 방식이었다.
이에 대안으로 JSON(Javascript Object Notation)이 등장하였으며, 현재는 대부분 JSON 형식을 사용하고 있으며
http 통신은 JSON 형태로 이루어지고 있다.
따라서 클라이언트 Tool(Httpie) 또한 JSON 형식으로 데이터를 주고 받는다.
자 그럼 본격적인 Serializer 란 무엇일까?
Serializer라는 DJango Rest Framework에서 나온 새로운 요소이다.
사전적 의미로 직렬화를 뜻하는데
간단하게 이해한다면 Python 데이터, QuerySet 데이터를 JSON 타입의 데이터로 변환해주는 역할을 한다 생각하면 된다.
위에서 설명하였듯 Http 통신, 즉 데이터를 주고받을때 JSON 형식을 주로 사용한다.
직렬화는 크게 2가지로 나눌수 있다.
1. Django Rest Framework _ Serailizer
2. Django in core 의 serailize (ModelSerailizer)
1번, 2번 모두 Django Project에서 내가 만든 Model 로부터 뽑은 QuerSet,
즉 Model instance 인스턴스를 JSON 타입으로 바꾸는것을 의미한다
차이점이라면
1번은 validation이 가능하며
2번은 validation이 불가능하다는 점이다.
결국 Serializer는 Djanog Model을 JSON으로 바꾸기 위한 모양 틀 정도로 이해하자
이번 Westagrm 프로젝트간 Serializer -> ModelSerialize를 사용하였다. (2번)
앞서 프로젝트에서 작성하였던 Model과 View 코드 중 일부분을 가져와 예를 들어보자.
아래의 경우에서는 요청에 대한 응답으로
Response의 Body에 JSON 데이터를 담아 응답으로 보내줘야하는 상황이다.
암만 View 구성을 잘 하여도 결국 데이터 변환을 하지 못하면 응답으로 보내줄 수 없다.
Http 통신에서는 QuerySet 객체나 Python 객체를 인식하지 못하기 때문이다.
Model
# Model from django.db import models from django.utils import timezone from user.models import User class Board(models.Model): board_name = models.CharField(max_length=45) user = models.ForeignKey(User, on_delete=models.CASCADE) time = models.DateTimeField(default=timezone.now) image = models.CharField(max_length=200, blank=True) contents = models.TextField() class Meta: db_table = 'boards'
View
import json from django.http import JsonResponse from django.views import View from django.core.serializers import serialize def get(self, request): try: board_values = Board.objects.all().order_by('-id') # 최신데이터 먼저 get_data = json.loads(serialize('json', board_values)) return JsonResponse({'board' : get_data}) except: return JsonResponse({'MESSAGE' : 'EMPTY_BOARD'}, status=400)
데이터베이스에 저장되어있는 게시물 데이터를 python 문법에 따라 메서드를 생성
QuerySet 객체로 불러온 후 QuerySet 객체 -> JSON 타입으로 변환해주는데 Serialize를 사용하였다.
물론 위와 같이 이 방법은 잘 작동하지만 데이터에 대한 validation을 하지 못한다는 단점이 있다.
즉, 내가 원하고자 하는 정보만을 출력해서 응답하지 못하는 단점이 있다.
현재 게시판에서는 모든 내용을 전부 출력하여 validation을 할 필요가 없으나
진행 간 이같은 단점을 해결 하기 위해선 아래와 같은 방법이 있다는 것을 기억하자
Django Rest Framework 인 serializers (직렬화)를 사용하면 해결 할 수 있다.
DRF Serializer를 사용하려면 어떻게 해야할까?
rooms이라는 APP 내부에 serializers.py 생성
Serializer의 내부에는 해당 api에서 보여주고 싶은 필드만 model에서 빼와서 활용하면 된다.
앞서 말한 validation이 이 serializer를 거쳐가며 이루어진다.
# rooms/seiralizers.py from rest_framework import serializers class RoomSerializer(serializers.Serializer): name = serializers.CharField(max_length=140) #price = serializers.IntegerField() #bedrooms = serializers.IntegerField() #instant_book = serializers.BooleanField() # 이름만 전달하고 싶다고 가정
@app_view를 활용한 뷰 모델 작성
#rooms/views.py from rest_framework.decorators import api_view from rest_framework.response import Response from . import models as rooms_models from .serializers import RoomSerializer # GET 방식만 받도록 함 @api_view(["GET"]) def list_rooms(request): rooms = rooms_models.Room.objects.all() # many=True의 역할은 rooms가 여러 값으로 이루어진 것이라는 것을 Serializer에게 알려주는 것 serialized_rooms = RoomSerializer(rooms, many=True) # HttpResponse가 아니라 DRF의 Response를 씁시다. return Response(data=serialized_rooms.data)
응답이 정삭적으로 이루어지며 name만 Body담겨질 것이다.
후에 프로젝트를 진행하며 직렬화를 다시 이용해야할 경우 해당 내용을 참고하여 해결하도록 하자!
출처 :darrengwon.tistory.com/480
728x90'TIL > Django' 카테고리의 다른 글
TIL.68 __str__은 무엇일까 (0) 2020.12.15 TIL.64 (Token)_Authentication (0) 2020.12.11 TIL.57 null=True 와 blank=True 의 차이(Django) (0) 2020.12.05 TIL.54 Httpie를 이용해 통신해보기(Django, MySQL) (0) 2020.12.02 TIL.51 API 란? (0) 2020.11.29