Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- airflow.cfg
- 데이터 파이프라인
- 파이썬
- AWS
- redshift
- 컴퓨터 네트워크
- TCP
- Go
- 데브코스
- 종류
- TIL
- 자료구조
- 데이터베이스
- sql
- 데이터엔지니어링
- 정리
- Django
- 데이터 웨어하우스
- S3
- airflow
- 가상환경
- PYTHON
- linux
- Docker
- 운영체제
- http
- 데이터 엔지니어링
- dockerfile
- HADOOP
- 컴퓨터네트워크
Archives
- Today
- Total
홍카나의 공부방
[DE 데브코스] 04.26 TIL - Serializer 본문

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
반응형
'Data Engineering > 프로그래머스 데브코스' 카테고리의 다른 글
[DE 데브코스] 05.05 TIL - 프로젝트, 네트워크, 데이터 개념 정리 (3) | 2023.05.05 |
---|---|
[DE 데브코스] 04.27 TIL - Django: User와 Authentication, Git의 기능 (0) | 2023.04.27 |
[DE 데브코스] 04.25 TIL - Django 템플릿 & 뷰 (2) | 2023.04.25 |
[DE 데브코스] 04.24 TIL - Django 기초 (0) | 2023.04.24 |
[DE 데브코스] 04.21 TIL - 야구 잘하는 팀 시각화, Seaborn, WordCloud (0) | 2023.04.21 |