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