Serialize
모델 인스턴스나 QuerySet과 같은 데이터를 JSON 형식의 파일로 변환하는 작업
Deserialize
JSON 형식의 데이터를 정의된 포맷에 맞추어 다시 모델 인스턴스로 변환하는 작업
다음은 Serializer에 대해 친절하게 설명해주신 블로그의 글이다(감사합니다!).
https://velog.io/@kjyeon1101/DRF-Serializer%EA%B0%80-%EB%AD%98%EA%B9%8C
[DRF] Serializer가 뭘까
아직도 대체 Serializer가 뭘 하는 놈인지 잘 모르겠다. 누가 물어보면 "어..... 직렬화?"라고 밖에 못할 수준.. 장고의 form이랑 비슷하다는데 실컷 직렬화 어쩌고 저쩌고 하다가 갑자기 폼이 왜 나오
velog.io
그럼 serializer가 장고 shell에서는 어떻게 동작하는지 알아보자.
polls_api/serializers.py에서
from rest_framework import serializers
from polls.models import Question
class QuestionSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
question_text = serializers.CharField(max_length=200)
pub_date = serializers.DateTimeField(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 rest_framework import serializers를 하려면 rest_framework이 설치되어 있어야 한다.
rest_framework설치는 명령 프롬프트에서 pip install djangorestframework 을 해주어야 한다.
문뜩 설치할 때, 파일 위치는 상관 없는지 궁금해서 GPT에게 물어봤다.
"pip은 시스템 전역에서 실행될 수 있도록 설계되어 있으며, Python 패키지들을 시스템 전역에 설치할 수 있습니다."
그럼 가상 환경을 활성화하고 설치해야 되나 싶어서 물어봤더니
"일반적으로 Python 프로젝트에서는 가상환경을 활성화한 후에 패키지를 설치하는 것이 좋습니다. 가상환경을 사용하면 프로젝트별로 독립된 Python 환경을 구성할 수 있으므로, 서로 다른 프로젝트 간의 패키지 충돌을 방지할 수 있습니다."
그 이후로도 이것저것 계속 물어봤다...
그리고 앞에서도 써놓았지만 장고 shell을 실행하려면 명령 프롬프트에서 python manage.py shell을 입력하고
shell을 실행할 때마다 from polls.models import *를 해주어야 한다.(Question이 자꾸 없다고 해서 당황했네..)
Django Shell에서
#Serialize
>>> from polls.models import Question
>>> from polls_api.serializers import QuestionSerializer
>>> q = Question.objects.first()
>>> q
<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2023-02-05 18:52:59+09:00>
>>> serializer = QuestionSerializer(q)
>>> serializer.data
{'id': 1, 'question_text': '휴가를 어디서 보내고 싶으세요?', 'pub_date': '2023-02-05T18:52:59Z'}
>>> from rest_framework.renderers import JSONRenderer
>>> json_str = JSONRenderer().render(serializer.data)
>>> json_str
b'{"id":1,"question_text":"\xed\x9c\xb4\xea\xb0\x80\xeb\xa5\xbc \xec\x96\xb4\xeb\x94\x94\xec\x84\x9c \xeb\xb3\xb4\xeb\x82\xb4\xea\xb3\xa0 \xec\x8b\xb6\xec\x9c\xbc\xec\x84\xb8\xec\x9a\x94?","pub_date":"2023-02-05T18:52:59Z"}'
# Deserialize
>>> import json
>>> data = json.loads(json_str)
>>> data
{'id': 1, 'question_text': '휴가를 어디서 보내고 싶으세요?', 'pub_date': '2023-02-05T18:52:59Z'}
>>> serializer = QuestionSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.validated_data
OrderedDict([('question_text', '휴가를 어디서 보내고 싶으세요?')])
>>> new_question = serializer.save() # Create
>>> new_question
<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2023-02-14 18:46:56.209215+00:00>
>>> data={'question_text': '제목수정'}
>>> serializer = QuestionSerializer(new_question, data=data)
>>> serializer.is_valid() #is_valid를 해야지 save를 사용할 수 있음
True
>>> serializer.save() # Update
<Question: 제목: 제목수정[시리얼라이저에서 업데이트], 날짜: 2023-04-25 13:15:05.852404+00:00>
#Validation이 통과하지 않는 경우
>>> long_text = "abcd"*300
>>> data = {'question_text':long_text}
>>> serializer = QuestionSerializer(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{'question_text': [ErrorDetail(string='Ensure this field has no more than 200 characters.', code='max_length')]}
ModelSerializer
그런데 ModelSerializer을 사용하면 훨씬 간단한 코드로 구현이 가능하다.
polls_api/serializers.py에서
from rest_framework import serializers
from polls.models import Question
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id','question_text', 'pub_date']
...
(진작에 좀 알려주지..)
'AI > 데이터 엔지니어링 데브코스' 카테고리의 다른 글
[3주차-3] 장고를 활용한 API서버 만들기 - Class 기반의 views (0) | 2023.04.29 |
---|---|
[3주차-3] 장고를 활용한 API서버 만들기 - HTTP Methods 기반의 views (0) | 2023.04.29 |
[3주차-2] 장고를 활용한 API서버 만들기 - 에러 처리하기, 커스터마이징 하기 (0) | 2023.04.29 |
[3주차-2] 장고를 활용한 API서버 만들기 - view 다루기 (0) | 2023.04.29 |
[3주차-1] 장고를 활용한 API서버 만들기 - 장고 admin, 모델 필터링 (0) | 2023.04.29 |