Serializer 주요 함수 및 활용
DRF Serializer에서 자주 사용되는 핵심 함수들과 데이터 검증 및 변환 활용법
to_representation
직렬화 출력 데이터 커스터마이징. 모델 데이터를 JSON으로 변환할 때 추가 필드나 변환 로직 적용
def to_representation(self, instance):
representation = super().to_representation(instance)
representation['likes_count'] = instance.liked_by.count()
representation['is_favorite'] = instance in self.context['user'].favorites.all()
return representationto_internal_value
역직렬화 입력 데이터 전처리. JSON에서 Python 객체로 변환할 때 데이터 정제 및 변환
def to_internal_value(self, data):
# 불필요한 중첩 데이터 제거
if 'info' in data:
data.pop('info')
return super().to_internal_value(data)validate
객체 레벨 검증. 여러 필드를 조합한 복합 검증 로직 구현
def validate(self, attrs):
if attrs['end_date'] < attrs['start_date']:
raise serializers.ValidationError("종료일은 시작일보다 늦어야 함")
return attrsvalidate_{field_name}
개별 필드 검증. 특정 필드에 대한 커스텀 검증 로직
def validate_email(self, value):
if User.objects.filter(email=value).exists():
raise serializers.ValidationError("이미 사용 중인 이메일")
return value
def validate_age(self, value):
if value < 18:
raise serializers.ValidationError("18세 이상만 가입 가능")
return valuesave
validated_data를 사용하여 객체 생성/수정
def save(self):
validated_data = self.validated_data
if self.instance:
return self.update(self.instance, validated_data)
return self.create(validated_data)create
새 객체 생성 로직 커스터마이징
def create(self, validated_data):
password = validated_data.pop('password')
user = User.objects.create_user(**validated_data)
user.set_password(password)
user.save()
return userupdate
기존 객체 수정 로직 커스터마이징
def update(self, instance, validated_data):
password = validated_data.pop('password', None)
for attr, value in validated_data.items():
setattr(instance, attr, value)
if password:
instance.set_password(password)
instance.save()
return instancevalidators 속성
필드별 검증 함수 목록 정의
def validate_username(value):
if len(value) < 3:
raise serializers.ValidationError("사용자명은 3자 이상이어야 함")
return value
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField(validators=[validate_username])SerializerMethodField
읽기 전용 계산된 필드 추가
class PostSerializer(serializers.ModelSerializer):
comment_count = serializers.SerializerMethodField()
days_since_created = serializers.SerializerMethodField()
def get_comment_count(self, obj):
return obj.comments.count()
def get_days_since_created(self, obj):
return (timezone.now().date() - obj.created_at.date()).daysget_{field_name}
SerializerMethodField와 함께 사용되는 메서드
full_name = serializers.SerializerMethodField()
def get_full_name(self, obj):
return f"{obj.first_name} {obj.last_name}"PreviousDjango Channels를 이용한 WebSocket 실시간 통신 연동 기초Next무한 스크롤을 위한 CursorPagination과 OffsetPagination의 차이
Last updated
