인프런 커뮤니티 질문&답변

devKya님의 프로필 이미지
devKya

작성한 질문수

Django REST Framework 핵심사항

DRF ImageField

to_representation() 오버라이딩 질문입니다.

작성

·

387

0

안녕하세요. 강의 잘 듣고 있습니다.

강의 내용 중 PostListAPIView의 get_serializer_context() 오버라이딩 말고

FileField()의 to_representaion() 메소드를 오버라이딩 하려고 시도중입니다. PostListSerializer에서 오버라이딩 하는 것으로 보이는데 방법을 잘 모르겠습니다.

아래와 같이 오버라이딩 하면, ModelSerializer의 to_representation()을 오버라이딩하게 되버립니다.

class PostListSerializer(serializers.ModelSerializer):
    category = serializers.ReadOnlyField(source='category.name')
    
    class Meta:
        model = Post
        fields = ['id', 'title', 'image', 'like', 'category'] 
        
    def to_representation(self, value):
        if not value:
            return None

        use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL)
        if use_url:
            try:
                url = value.url
            except AttributeError:
                return None
            request = self.context.get('request', None)
            if request is not None:
                return url
            return url

        return value.name

답변 3

0

김석훈님의 프로필 이미지
김석훈
지식공유자

제 PC 에서는 잘되고 있습니다.

이전 코드는 삭제했는지요 ?

views.py 에서 PostListAPIView 의 get_serializer_context() 메소드는 삭제 요망.

그래도 안되면, PostListAPIView 와 PostListSerializer 코드와 에러 메세지를 올려 줄래요.

0

devKya님의 프로필 이미지
devKya
질문자

안녕하세요. 강사님.

답변 감사합니다.

 

강사님께서 제공해주신 코드로 진행해보니, id, title, image ... 도 to_representation() 메소드에 영향을 받아 제대로 출력되지 않고,

The 'image' attribute has no file associated with it. 라는 에러를 출력합니다.

0

김석훈님의 프로필 이미지
김석훈
지식공유자

안녕하세요. 독자님.

독자님의 얘기처럼, PostListSerializer 의 to_representation() 을 오버라이딩하는게 맞습니다.

아래 코드처럼, 오버라이딩할 내부 로직이 복잡할 때는, super() 로 가져와서, 원하는 필드만 바꿔주면 됩니다. 그리고 instance.image.url 이 장고에서 디폴트로 만들어주는 url 입니다.

class PostListSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source='category.name')

    class Meta:
        model = Post
        fields = ['id', 'title', 'image', 'like', 'category']

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['image'] = instance.image.url
        return ret
devKya님의 프로필 이미지
devKya

작성한 질문수

질문하기