Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

최용우

장고 DRF(Django RestFramework) 필드 옵션 본문

장고

장고 DRF(Django RestFramework) 필드 옵션

용우쨩 2025. 2. 14. 23:47

장고를 사용하다보면 시리얼라이저의 필드 옵션을 종종 사용한다.

특히, 클라이언트에서 서버로 데이터를 받기만 하고싶은 필드는 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)  # {} (입력값이 무시됨)