이번 포스팅에서는 Model을 만들 때 보편적으로 사용하는 Model Serialize에 대해 말해보겠습니다.
지금까지는 일반적인 Serialize를 커스텀해서 사용했지만 실제 개발에는 Model Serialize를 주로 사용합니다.
- Model Serialize 사용하기
- 코드로 Model에 Field 추가하기
- Model에 새로운 아이템 추가하기
장고 REST API 프레임워크에서 Model Serializer 사용하기
먼저 공식 문서는 다음과 같습니다.
https://www.django-rest-framework.org/api-guide/serializers/#modelserializer
이를 이때까지 제가 예시로 만든 MovieSerializer에 적용하면 다음과 같이 작성할 수 있습니다.
class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
# 모든 Field를 사용하게 한다.
fields = "__all__"
# 사용하고 싶은 Field를 지정하고 싶으면 다음과 같이 한다
# fields = ['id', 'name', 'description']
# 또는 특정 Field만 제외하고싶다면 다음과 같이 한다.
# exclude = ['activity']
def validate(self, data):
if data['name'] == data['description']:
raise serializers.ValidationError("이름과 내용이 같아선 안됩니다.")
else:
return data
# field level validation
# validate_필드 이름으로 만들면 자동으로 오버라이드 해준다.
def validate_name(self, value):
if len(value) < 2:
raise serializers.ValidationError("이름이 너무 짧습니다.")
else :
return value
이를 통해 알 수 있는 Model Serialize는 다음과 같은 특성이 있습니다.
- fields에 원하는 필드만 지정해서 사용할 수 있다
- 반대로 exclude에 원하지 않는 필드만 지정해서 사용할 수 있다
- 유효성 검증을 하는 방법은 일반 Serialize와 동일하다.
코드로 Model에 Field 추가하기
지금까지는 modesl.py 파일에 직접 Field를 정의해서 사용했습니다.
# /watchlist_app/models.py
from django.db import models
class Movie(models.Model):
# Model(=DB)에서 사용할 Column 정의
name = models.CharField(max_length=50)
description = models.TextField(max_length=200)
active = models.BooleanField(default=True)
def __str__(self):
return self.name
하지만 Model Serializer를 사용하면 간단하게 코드를 사용한 Field를 생성할 수 있습니다.
위에서 생성한 Movie를 그대로 사용하여 다음과 같이 작성합니다.
class MovieSerializer(serializers.ModelSerializer):
# 새로운 Field 정의
len_name = serializers.SerializerMethodField()
class Meta:
model = Movie
# 모든 Field를 사용하게 한다.
fields = "__all__"
# 사용하고 싶은 Field를 지정하고 싶으면 다음과 같이 한다
# fields = ['id', 'name', 'description']
# 또는 특정 Field만 제외하고싶다면 다음과 같이 한다.
# exclude = ['activity']
# "get_필드 이름"으로 하면 자동으로 프레임워크가 새로운 Field라고 인식한다.
def get_len_name(self, object):
return len(object.name)
- serializers.SerializerMethodField()를 사용하여 새로운 Field를 정의한다
- get_필드 이름 으로 함수를 정의하면 자도으로 프레임워크가 새로운 Field를 생성해 준다.
그 결과 다음과 같이 자동으로 Field가 추가된 것을 확인할 수 있습니다.
Model에 새로운 아이템 추가하기
이번에는 Model에 새로운 아이템을 추가하는 방법에 대해 알아보겠습니다.
먼저 다음과 같이 기존에 있던 Movie라는 모델에 created라는 아이템을 추가합니다.
class Movie(models.Model):
# Model(=DB)에서 사용할 Column 정의
name = models.CharField(max_length=50)
description = models.TextField(max_length=200)
active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
그리고 아이템을 추가해 준 경우에는 반드시 Model의 마이그레이션을 실시해줘야 합니다.
커맨드에 다음과 같이 입력합니다.
python manage.py makemigrations
그럼 다음과 같은 경고가 발생하는 것을 볼 수 있습니다.
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
해당 경고는 방금 생성한 created는 auto_now_add=True 옵션이 들어가 있는데
초기값을 뭐로 할 건지는 정의되어있지 않기 때문에 초기값을 정해 달라는 의미입니다.
1번을 입력하면 바로 다음 커맨드로 어떤 초기값으로 설정할지 물어보는 질문이 나옵니다.
아무것도 입력하지 않고 enter 키를 누르면 현재 시간이 자동으로 초기값으로 설정됩니다.
2번을 입력하면 현재 커맨드를 종료하고 직접 코드상에서 기본값을 지정해줘야 합니다.
그 이후 다시 python manage.py makemigrations을 진행합니다.
(저는 1번으로 진행했습니다.)
이후 아래의 커맨드를 실시하여 마이그레이션을 적용해 줍니다.
python manage.py migrate
그럼 다음과 같이 정상적으로 실행되는 것을 확인할 수 있습니다.
'파이썬(Python) > 장고(Django)' 카테고리의 다른 글
[기초] 파이썬 장고 REST API - Nested Relationships (0) | 2024.02.15 |
---|---|
[기초] 파이썬 장고 REST API - Relationship 설정하기 (1) | 2024.02.05 |
[기초] 파이썬 장고 REST API 프레임워크 - Validation (0) | 2024.02.02 |
[기초] 파이썬 장고 REST API 프레임 워크 - Class-based Views (0) | 2024.02.01 |
파이썬 Django REST API 프레임워크 CRUD 사용하기 (2) | 2024.01.31 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글