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