ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.58 Django Rest Framework_serializer(직렬화)
    TIL/Django 2020. 12. 6. 23:43
    728x90

    클라이언트의 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

     

    DRF serializers를 통해 장고 객체를 json으로 만들기

    urls.py에서 url을 설정하고, view 단에서 논리적인 구성을 하는 것은 일반 Django와 똑같습니다. 우선 대강 url 구성먼저 합시다. GET api/v1/rooms/list를 날리면 모든 방을 json 형태로 반환할 것입니다. # con

    darrengwon.tistory.com

    devkor.tistory.com/entry/03-Django-Rest-Framework-Serializer-View-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0

     

    02. Django Rest Framework, Serializer, View 개념 익히기

    Hello World 코드 설명 # (수정) 추후 설명하는 그림을 첨부할 예정입니다. GET 127.0.0.1:8000/api/hello/ 지난 시간에 해당 주소로 요청을 보내면 hello world를 print하는 api를 만들었습니다. 각 단계를 다시..

    devkor.tistory.com

     

    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
Designed by Tistory.