데브코스/Week 5

Week 5 - 3

out_of_anjoong 2024. 4. 10. 17:30

Serializers

serialize : Model Instance나 QuerySet과 같은 데이터를 JSON 형식의 파일로 변환
deserialize : JSON 형식의 데이터를 다시 Model Instance로 변환
API 서버에서는 JSON 형식으로 데이터를 주고받기 때문에 해당 작업이 필요하다.

# serializers.py
from rest_framework import serializers # pip install djangorestframework 필요
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)
	# serialize를 할 때는 모델의 각 필드를 다 입력하여야 한다.
    
	# serializer은 생성을 할 때 유효성 검사를 하며 통과한 데이터는 validated_data로 주어짐.
    def create(self, validated_data):
        return Question.objects.create(**validated_data)

	
    def update(self, instance, validated_data):
    	# validated_data.get('question_text', instance.question_text) question_text를 가져오고 못가져 온다면 instance.question_text로 유지해라.
        instance.question_text = validated_data.get('question_text', instance.question_text)
        instance.save()
        return instance
    
    
    class Meta:
        model = Question
        fields = ['id','question_text', 'pub_date']
	# 일일이 create, update를 정의할 필요 없이 위 코드를 이용하면 자동으로 생성됨.

 

HTTP Methods

CRUD : CREATE, READ, UPDATE, DELETE

  • GET : 요청한 데이터를 받을 때 사용 (READ)
  • POST : 특정 리소스에 엔티티를 제출할 때 사용. (CREATE)
  • PUT : 내용을 수정 (UPDATE)
  • DELETE : 특정 리소스를 삭제 (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)