최용우
장고 DRF(Django RestFramework) 필드 옵션 본문
장고를 사용하다보면 시리얼라이저의 필드 옵션을 종종 사용한다.
특히, 클라이언트에서 서버로 데이터를 받기만 하고싶은 필드는 write_only를 쓰고
서버에서 클라이언트 쪽으로 데이터를 보내기만 하고싶은 필드는 read_only쓰면 된다.
이처럼 옵션을 적절하게 사용하면 시리얼라이저의 재사용성을 높이고 최적화시킬 수 있다.
아래 예제와 함께 옵션을 소개한다.
필드 옵션
- required=True → 필수 입력
- allow_null=True → null 허용
- default=값 → 기본값 설정
- validators=[검증함수] → 커스텀 검증기 적용
- write_only=True → 입력만 가능 (출력 X)
- read_only=True → 읽기만 가능 (입력 X)
1. required=True 예제
만약 required=False라면 해당 필드를 클라이언트에서 받지 않아도 된다.
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(required=True)
# 테스트
data = {}
serializer = UserSerializer(data=data)
serializer.is_valid() # False (username이 없어서)
print(serializer.errors) # {'username': ['This field is required.']}
2. allow_null=True → null 허용
만약 allow_null=False라면 null을 허용하지 않는다.
class ProfileSerializer(serializers.Serializer):
bio = serializers.CharField(allow_null=True) # null 허용
# 테스트
data = {'bio': None}
serializer = ProfileSerializer(data=data)
serializer.is_valid() # True (null 허용)
print(serializer.validated_data) # {'bio': None}
3. default=값 (기본값 설정)
해당 필드를 입력하지 않으면 기본값이 자동으로 설정됨.
class PostSerializer(serializers.Serializer):
status = serializers.CharField(default="draft") # 기본값 설정
# 테스트
data = {}
serializer = PostSerializer(data=data)
serializer.is_valid() # True
print(serializer.validated_data) # {'status': 'draft'}
4. validators=[검증함수] (커스텀 검증기 적용)
값이 특정 조건을 만족해야 함.
def validate_positive(value):
if value <= 0:
raise serializers.ValidationError("Must be greater than zero.")
return value
class ProductSerializer(serializers.Serializer):
price = serializers.IntegerField(validators=[validate_positive])
# 테스트
data = {'price': -5}
serializer = ProductSerializer(data=data)
serializer.is_valid() # False
print(serializer.errors) # {'price': ['Must be greater than zero.']}
5. write_only=True (입력만 가능, 출력 불가)
해당 필드는 API 응답(서버에서 클라이언트로 보낼때)에서 제외되지만, 입력값으로 받을 수 있음.
class UserSerializer(serializers.Serializer):
password = serializers.CharField(write_only=True)
# 테스트
data = {'password': 'secure123'}
serializer = UserSerializer(data=data)
serializer.is_valid() # True
print(serializer.validated_data) # {'password': 'secure123'}
print(serializer.data) # {} (password는 출력되지 않음)
6. read_only=True (읽기 전용, 입력 불가)
해당 필드는 응답에서만 표시되고, 입력값으로는 받을 수 없음.
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
# 테스트
data = {'id': 1}
serializer = UserSerializer(data=data)
serializer.is_valid() # True
print(serializer.validated_data) # {} (입력값이 무시됨)
'장고' 카테고리의 다른 글
| Django 프로젝트 회고. 나의 부족한 추상화 능력 (0) | 2025.04.12 |
|---|---|
| Docker란? 그리고 필요한 이유 (2) | 2025.01.05 |
| Django-graphene에서 타입 이름 변경하기 (3) | 2024.10.27 |
| Django에서 Graphql을 사용해보자 (1) | 2024.10.12 |
| 변수 이름 짓기 규칙(스네이크, 카멜, 파스칼, 케밥) (1) | 2024.09.27 |
