홍카나의 공부방

[DE 데브코스] 04.26 TIL - Serializer 본문

Data Engineering/프로그래머스 데브코스

[DE 데브코스] 04.26 TIL - Serializer

홍문관카페나무 2023. 4. 26. 18:13

 

Serializer

  • 모델 인스턴스나, QuerySet과 같은 데이터를 JSON 형식의 파일로 변환하는 작업을 Serialize라고 한다.
  • 반대로 Deserialize는 JSON 형식의 데이터를 정의된 포맷에 맞춰 모델 인스턴스로 변환하는 작업이다.
  • Django에서는 Serializer라는 모듈로 Serialize, Deserialize를 수행할 수 있다.
  • 아래는 객체를 만들거나, 업데이트하는 serializer.py의 예시 코드다.
  • Django Shell에서 Serializer를 사용하여 객체를 새로 만들 수도 있다.
from rest_framework import serializers
from polls.models import Question


class QuestionSerializer(serializers.Serializer):
    # id는 쓰거나 바꿀수 있는 값이 아니라 read only
    id = serializers.IntegerField(read_only=True)
    question_text = serializers.CharField(max_length=200)
    pub_date = serializers.DateField(read_only=True)

    def create(self, validated_data):
        return Question.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.question_text = validated_data.get('question_text', instance.question_text)
        instance.save()
        return instance
from polls.models import Question
from polls_api.serializers import QuestionSerializer
import json
from rest_framework.renderers import JSONRenderer

# Serialize

q = Question.objects.first()
serializer = QuestionSerializer(q)
json_str = JSONRenderer().render(serializer.data)

# Deserialize

data = json.loads(json_str)
seri = QuestionSerializer(data=data)
seri.is_valid()
newq = serializer.save() # Create

 

ModelSerializer

  • serializers.ModelSerializer를 이용하면 손쉽게 Serializer를 만들 수 있다. 예를 들어
class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Question
        fields = ['id','question_text', 'pub_date']
  • 위와 같이 코드가 작성되어 있다면, Meta 클래스 내부의 models 속성으로 Serializer할 대상 모델을 정하고,
  • fields 속성으로 Serialize할 대상 필드를 리스트 형태로 나열하여 지정할 수 있다.
  • 기본적으로 create()와 update() 메서드가 구현되어 있어서, 추가로 코드로 구현해줄 필요가 없다.
  • 이번 구현에 사용한 views.py는 다음과 같다. method를 이용한 방법이다.
from rest_framework.decorators import api_view
from polls.models import Question
from polls_api.serializers import QuestionSerializer
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404

# api_view 파라미터에 아무것도 없으면, GET 요청만 처리
@api_view(['GET','POST'])
def question_list(request):
    if request.method == 'GET':
        questions = Question.objects.all()
        serializer = QuestionSerializer(questions, many = True)
        return Response(serializer.data)
    
    if request.method == 'POST':
        serializer = QuestionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        
@api_view(['GET', 'PUT', 'DELETE'])
def question_detail(request, id):
    question = get_object_or_404(Question, pk=id)
    
    if request.method == 'GET':
        serializer = QuestionSerializer(question)
        return Response(serializer.data)

    if request.method == 'PUT':
        serializer = QuestionSerializer(question, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:    
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    if request.method == 'DELETE':
        question.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

HTTP REQUEST METHOD

  • GET : 특정 리소스의 표시를 요청, 즉 데이터 조회(Read)
  • POST : 데이터 생성(Create)
  • PUT : 데이터 업데이트(Update)
  • DELETE : 데이터 삭제(Delete)

 

MIXIN, Generic API View

  • mixin은 클래스 기반 뷰에서 공통적으로 사용하는 기능을 모듈화하여 재사용 가능한 코드를 만들 수 있게 해준다.
  • Generic API View는 RESTful API를 구축하기 위해 제공되는 클래스 기반 뷰다.
  • 이를 사용하면 CRUD에 대한 기능을 제공하는 뷰를 간단하게 작성할 수 있다.
  • 아래는 Generic API View의 사용 예시다. 파라미터로 ListCreate, RetrieveUpdateDestroy를 건네준 것을 확인할 수 있는데, 이를 자세히 살펴보면 mixins을 사용한 것을 알 수 있다. 즉, 엄연히 이야기하면 MIXIN + Generic API View다. 
from polls.models import Question
from polls_api.serializers import QuestionSerializer
from rest_framework import generics

class QuestionList(generics.ListCreateAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

class QuestionDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

 

오늘 공부하며 어려웠던 내용

  • REST framework 부분은 예전 장고 프로젝트때 건드렸던 부분이 아니기 때문에 학습하는데 시간이 좀 걸렸다.
  • 추가로 git Convention 정리한것도 있다.

https://hongcana.tistory.com/73

 

[Git] commit convention 정리

길게 정리 안합니다. 쉽게 쉽게 갑시다. 커밋 메세지 컨벤션을 하는 이유 협업 시, 상대방이 어떤 코드를 작성했는지 알아보기 쉽기 하기 위해 커밋의 안좋은 예시 커밋의 나쁘지 않은 예시 이게

hongcana.tistory.com

 

 

반응형