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
- AWS
- Go
- 데이터 웨어하우스
- HADOOP
- S3
- 데이터엔지니어링
- http
- 파이썬
- dockerfile
- 컴퓨터 네트워크
- TCP
- 운영체제
- 정리
- 컴퓨터네트워크
- 데이터베이스
- TIL
- 자료구조
- 데이터 파이프라인
- redshift
- 가상환경
- 종류
- linux
- airflow.cfg
- Django
- PYTHON
- 데브코스
- sql
- Docker
- 데이터 엔지니어링
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
반응형
'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 |