터칭 데이터
장고(Django) 시리얼라이저(Serilaizer) 본문
시리얼라이저(Serilaizer)는?
장고 웹 프레임워크의 Serializer(직렬화)는 데이터베이스 모델의 데이터를 JSON 또는 다른 형식으로 변환하고, 반대로 JSON 데이터를 모델 객체로 역직렬화할 수 있는 도구입니다. 이는 웹 API 개발 및 데이터 교환을 간편하게 만드는 데 사용됩니다.

Serializer의 주요 역할과 특징은 다음과 같습니다:
1. 모델 데이터를 JSON 또는 다른 형식으로 변환: Serializer를 사용하여 데이터베이스 모델의 객체를 JSON 형식으로 변환할 수 있습니다. 이렇게 변환된 데이터는 API 응답으로 클라이언트에 전송됩니다.
2. 역직렬화: Serializer는 JSON 데이터를 받아 데이터베이스 모델 객체로 역직렬화하는 데 사용됩니다. 이를 통해 클라이언트가 데이터를 전송하고 서버에서 해당 데이터를 처리할 수 있습니다.
3. 데이터 유효성 검사: Serializer는 데이터의 유효성을 검사하고 필드 유효성 검사 규칙을 적용할 수 있습니다. 이는 잘못된 데이터가 서버로 전송되는 것을 방지합니다.
4. 중첩된 객체: Serializer를 사용하여 중첩된 객체를 처리할 수 있습니다. 예를 들어, 부모 모델과 자식 모델 간의 관계를 처리할 수 있습니다.
5. 다양한 직렬화 포맷: Serializer는 JSON 뿐만 아니라 다른 직렬화 포맷 (XML, YAML 등)으로도 작업할 수 있습니다.
장고에서는 기본적으로 `rest_framework.serializers` 모듈을 통해 Serializer 클래스를 제공합니다. Serializer를 정의하려면 일반적으로 다음과 같이 클래스를 작성합니다:
from rest_framework import serializers
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
위 코드에서 `MyModel`은 데이터베이스 모델이며, `MyModelSerializer`는 해당 모델을 직렬화하기 위한 Serializer입니다.
Serializer는 장고 REST 프레임워크 (Django REST framework)와 같은 서드파티 패키지에서 제공하는 많은 기능을 지원합니다. 이를 통해 API를 구축하고 데이터를 효과적으로 처리할 수 있습니다. Serializer는 웹 API를 개발할 때 중요한 구성 요소 중 하나이며, 데이터를 안전하게 전송하고 처리하는 데 도움을 줍니다.
시리얼라이즈를 구현할 새로운 앱을 만들자
(DjangoProjects) ...\mysite>python manage.py startapp polls_api
mysite 프로젝트에 polls_api라는 앱(폴더)을 만듭니다.
그리고 polls_api앱에 serializers.py라는 파일을 만듭니다.
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
먼저 id, question_text, pub_date는 Question 모델의 필드들을 지칭합니다.
Serializer에 적어주지 않은 필드들의 데이터는 Serializer되지 않으니 주의하셔야 합니다.
question_text의 max_length=200은 최대 글자가 200이어야 한다는 Question 모델의 조건을 시리얼라이저에서도 똑같이 준수한 것입니다. id와 pub_date는 read_only=True로 되어있는데 읽기만 가능하다는 뜻으로 Quesiton의 id와 pub_date는 데이터의 생성과 함께 자동 생성되는 필드들이기 때문입니다.
Django REST framework의 Serializer를 사용하여 RESTful API를 개발할 때, Serializer 클래스에는 데이터를 생성 및 업데이트하는 메서드를 정의할 수 있습니다. 이러한 메서드는 Serializer 클래스에서 제공하며, 보통 `create` 및 `update` 메서드로 구현됩니다.
1. **create 메서드**: `create` 메서드는 Serializer를 사용하여 새로운 객체를 생성하는 데 사용됩니다. 이 메서드는 주로 POST 요청을 처리하며, 요청 데이터를 기반으로 새로운 모델 객체를 생성하고 데이터베이스에 저장합니다.
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
주어진 인자 validated_data는 시리얼라이즈에 앞서 유효한지 확인된 데이터들만 사용하겠다는 뜻으로 예를 들어 question_text가 200자를 넘어가는 데이터는 시리얼라이즈를 허용하지 않을 것입니다.
2. **update 메서드**: `update` 메서드는 Serializer를 사용하여 이미 존재하는 객체의 데이터를 업데이트하는 데 사용됩니다. 이 메서드는 주로 PUT 또는 PATCH 요청을 처리하며, 요청 데이터를 기반으로 모델 객체의 필드를 업데이트합니다.
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
update는 create와 달리 이미 존재하는 데이터들만 수정하는 메서드로 업데이트할 모델 객체의 인스턴스를 나타내는 인자 instance를 받습니다. instance 인자의 역할은 업데이트할 대상 모델의 이미 존재하는 객체를 나타냅니다. 그래서 instance.question_text 이후 instance.save()를 하면 모델의 데이터를 변경할 수 있는 것입니다.
위의 예시에서, `create` 및 `update` 메서드는 `MyModel` 모델을 기반으로 한 Serializer에 정의됩니다. 이러한 메서드를 사용하면 Serializer에서 데이터베이스 모델 객체의 생성과 업데이트를 커스터마이즈할 수 있습니다. Serializer는 RESTful API에서 요청 및 응답 데이터를 모델 객체로 변환하고, 그 반대로 모델 객체를 JSON 또는 다른 직렬화된 형식으로 변환하는 데 사용됩니다.
'장고 (Django)' 카테고리의 다른 글
장고(Django) ModelSerializer (0) | 2023.11.04 |
---|---|
장고(Django) 장고 쉘에서 Serializer 사용하기 (0) | 2023.11.04 |
장고(Django) 결과(result) 조회 페이지 (0) | 2023.11.03 |
장고 (Django) 에러 방어하기 2 (0) | 2023.11.03 |
장고(Django) 에러 방어 (0) | 2023.11.03 |