W | eb
Django CRUD: Serialize
덞웖이
2024. 10. 8. 23:59
환경
- Ubuntu Server 22.04
- VSCode Insider
- Remote SSH Extension
- Python 3.10 venv
- Django 5.1.1
- SQLite 3.37.2
준비
source django_env/bin/activate
# 다른 OS는 모르겠는데 우분투는 이걸로 설치해야 import제대로 됨
pip install djangorestframework
# @test_proj/settings.py
# INSTALLED_APPS 리스트에 'rest_framework' 추가
# @devcourse_django/test_proj/
python manage.py startapp polls_api
touch polls_api/serializers.py
실행
serializers.py
# Model() -> serialize() -> {JSON} -> deserialize() -> Model()
# polls_api/serializers.py
from rest_framework import serializers
from polls.models import Question
### 긴 버전
class QuestionSerializer(serializers.Serializer):
# must match model fields
id = serializers.IntegerField(read_only=True)
question_text = serializers.CharField(max_length=200)
pub_date = serializers.DateTimeField(read_only=True)
# insert
def create(self, validated_data):
return Question.objects.create(**validated_data)
# update
def update(self, instance, validated_data):
# if no valid, keep original, else assign new
# validated_data is an OrderedDict
instance.question_text = validated_data.get('question_text', instance.question_text) + '[Serializer Update]'
instance.save()
return instance
### simpler with ModelSerializer (앞으로 쓸거)
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id', 'question_text', 'pub_date']
Django Shell: Serialize - Deserialize Test
# python manage.py shell
from polls.models import Question
from polls_api.serializers import QuestionSerializer
from rest_framework.renderers import JSONRenderer
q = Question.objects.first()
q
# <Question: [title: ideal vacation location?] [date: 2024-10-05 04:34:52+00:00]>
serializer = QuestionSerializer(q)
serializer.data
# {'id': 1, 'question_text': 'ideal vacation location?', 'pub_date': '2024-10-05T04:34:52Z'}
json_str = JSONRenderer().render(serializer.data)
json_str
# b'{"id":1,"question_text":"ideal vacation location?","pub_date":"2024-10-05T04:34:52Z"}'
### Serialize 완료 ---------------------
import json
data = json.loads(json_str)
data
# {'id': 1, 'question_text': 'ideal vacation location?', 'pub_date': '2024-10-05T04:34:52Z'}
serializer = QuestionSerializer(data=data)
serializer.is_valid()
serializer.validated_data # {'question_text': 'ideal vacation location?'}
new_question = serializer.save() # 모델에 적재까지 해야
new_question.id # some_id
### 비로소 Deserialized ---------------------
### Update
data={'question_text': 'title edit'}
serializer = QuestionSerializer(new_question, data=data)
# serializer.validated_data 와 .save()는 .is_valid() 호출 뒤에 해야함
serializer.is_valid() # True
serializer.validated_data # {'question_text': 'title edit'}
serializer.save() # update 할지 create 할지 알아서 판단함
CRUD is short for Crush, Ruin, Undermine and Destroy