작성
·
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
안녕하세요. 강사님.
답변 감사합니다.
강사님께서 제공해주신 코드로 진행해보니, 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