class BlogChildPagesSerializer(Field):
    def to_representation(self, child_pages):
        # logic in h
        # return_posts = []
        # for child in child_pages:
        #     post_dict = {
        #         'id': child.id,
        #         'title': child.title,
        #         'slug': child.slug,
        #         'url': child.url,
        #     }
        #     return_posts.append(post_dict)
            
        # return return_posts
        return [
            {
                'id': child.id,
                'title': child.title,
                'slug': child.slug,
                'url': child.url,
            } for child in child_pages
        ]


class BlogListingPage(Page):

	...
    
    api_fields = [
        APIField("get_child_pages", serializer=BlogChildPagesSerializer()),
    ]
    
    @property
    def get_child_pages(self):
        return self.get_children().public().live()

기존 class에 없던 데이터나 정보를 API Server에 전달하고 싶을 때에는 Serializer를 사용한다. 다만 단순히 Wagtail의 QuerySet을 전달하면 JSON형식의 데이터가 아니라서 API Server에서 오류가 난다. 

 

그래서 Serializer에서 JSON형식의 데이터를 전달해주기 위해 데이터를 가공을 해줘야한다. 

 

다만, 이미 property에서 field set을 선택하여 return 한다면 Serializer는 필요없다. 

간단한 데이터를 전달할 것이면 아래와 같은 방법으로 전달해도 된다. 

 

class BlogListingPage(Page):
  
    api_fields = [
        APIField("get_child_pages"),
    ]
    
    @property
    def get_child_pages(self):
        return self.get_children().public().live().values("id", "title", "slug")

 

 

추가)

api_fields = [
	APIField("posts", serializer=BlogChildPagesSerializer(source='get_child_pages')),
]

만약에 API Server에 posts라는 이름으로 데이터를 표시하고 싶다면 위와 같이 작성하면 된다. 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail Rich Editor Extend  (0) 2021.11.27
Wagtail API v2 Serializing Rich Text  (0) 2021.11.25
Wagtail API v2 Custom Page Properties  (0) 2021.11.25
Wagtail API v2 Image Rendition Field  (0) 2021.11.24
Wagtail API v2 Serializers  (0) 2021.11.24

+ Recent posts