Django Models의 image field에 API를 적용하여 확인해보면 다음과 같은 오류가 발생한다. 

이럴 때, API에 관련 Field의 정보를 Custom해서 표시해줄 수 있는 Serializer가 필요하다. 

 

from rest_framework.fields import Field


class ImageSerializedField(Field):
    
    def to_representation(self, value):
        return {
            "url": value.file.url,
            "title": value.title,
            "width": value.width,
            "height": value.height,
        }
        
        
class BlogAuthorsOrderable(Orderable):
    
    page = ParentalKey("blog.BlogDetailPage", related_name="blog_authors")
    author = models.ForeignKey(
        "blog.BlogAuthor",
        on_delete=models.CASCADE,
    )
    
    panels = [
        SnippetChooserPanel("author"),
    ]
    
    @property
    def author_image(self):
        return self.author.image
    
    api_fields = [
        APIField('author_image', serializer=ImageSerializedField()),
    ]

Django rest_framework모듈에서 Field을 상속받아서 Serializer를 만든다. 

def to_representation(self, value):

에서의 value는 APIField의 field 값. 즉, 'author_image'(=author.image)를 가르킨다.

 

 

추가)

class BannerCTASerializer(Field):
    def to_representation(self, page):
        return {
            'id': page.id,
            'title': page.title,
            'first_published_at': page.first_published_at,
            'owner': page.owner.username,
            'slug': page.slug,
            'url': page.url,
        }


class HomePage(page):

  api_fields = [
      APIField('banner_cta', serializer=BannerCTASerializer()), 
  ]

Serializer에는 API에 필요한 모든 Logic을 추가할 수 있다.

+ Recent posts