source 속성 활용: 관계 데이터 조회 및 모델의 property
Serializer의
source속성을 활용하여 필드 이름 변경, 관계 데이터 조회, 모델 property 접근을 통해 더 유연한 API 응답 구조 생성
source 속성 기본 개념
Serializer 필드가 참조할 모델의 실제 필드나 속성을 지정하는 역할
기본적으로 Serializer 필드명과 모델 필드명을 매칭하지만,
source로 다른 필드 참조 가능API 스펙과 DB 컬럼명이 다를 때, 관계 모델 데이터 조회 시, 모델 property 사용 시 활용
필드 이름 변경
class PostSerializer(serializers.ModelSerializer):
writer = serializers.CharField(source='author_name')
class Meta:
model = Post
fields = ['id', 'title', 'content', 'writer']관계 데이터 조회
정방향 관계 (ForeignKey)
class PostSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='author.username', read_only=True)
author_email = serializers.EmailField(source='author.email', read_only=True)
class Meta:
model = Post
fields = ['id', 'title', 'username', 'author_email']N+1 문제 해결 필수: select_related('author') 사용으로 쿼리 최적화
ManyToMany 관계
class PostSerializer(serializers.ModelSerializer):
tag_count = serializers.IntegerField(source='tags.count', read_only=True)
class Meta:
model = Post
fields = ['id', 'title', 'tag_count']최적화: prefetch_related('tags') 사용
모델 Property 및 Method 활용
@property 사용
# models.py
class CustomUser(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
# serializers.py
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='full_name', read_only=True)인자 없는 메소드 호출
# models.py
class Product(models.Model):
stock = models.PositiveIntegerField()
def is_in_stock(self):
return self.stock > 0
# serializers.py
class ProductSerializer(serializers.ModelSerializer):
availability = serializers.BooleanField(source='is_in_stock', read_only=True)source vs SerializerMethodField 선택 기준
사용 상황
권장 방법
단순 필드명 변경
source
관계 모델 필드 접근
source
인자 없는 property/method
source
복잡한 로직, request 정보 필요
SerializerMethodField
핵심 주의사항
관계 데이터 접근 시 N+1 쿼리 문제 방지를 위해
select_related또는prefetch_related필수 사용source로 가져온 데이터는 대부분read_only=True설정인자가 있는 메소드는
source로 호출 불가,SerializerMethodField사용 필요
Last updated
