Wagtail API fields은 정말 간단하고 사용하기 쉽게 되어있다. 다만 Wagtail만의 Model(Page, Orderable..)에서만 사용이 가능하다. 즉, Django models에서는 api_fields를 사용할 수가 없다. 그래서 이번에는 ForeignKey을 사용하는 field에서의 API 적용을 정리한다. 

 

1. Wagtail Models

 

home/models.py

class HomePageCarouselImages(Orderable):
    """Between 1 and 5 images for the home page carousel."""
    
    page = ParentalKey("home.HomePage", related_name="carousel_images")
    carousel_image = models.ForeignKey(
        "wagtailimages.Image",
        null=True,
        blank=False,
        on_delete=models.SET_NULL,
        related_name="+",
    )
    
    panels = [
        ImageChooserPanel("carousel_image"),
    ]
    
    api_fields = [
        APIField("carousel_image")
    ]
    

class HomePage(RoutablePageMixin, Page):
    # home page model
    
    ...
    
    content = StreamField(
        [
            ("cta", blocks.CTABlock()),
        ],
        null=True,
        blank=True
    )
    
    api_fields = [
        ...
        APIField('carousel_images'),
        APIField('content'),
    ]

위 코드를 살펴보자. HomePageCarouselImages가 HomePage 모델에 Inline으로 포함되어 있다. 그리고 content는 StreamField이다. 두 모델 전부 Wagtail Model일 경우 간단하게 두 모델에 전부 api_fields를 적어주면 된다. 

 

 

2. Django Models

 

blog/models.py

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_name(self):
        return self.author.name
    
    @property
    def author_website(self):
        return self.author.website
    
    api_fields = [
        APIField('author_name'),
        APIField('author_website'),
    ]
    
    
class BlogAuthor(models.Model):
    """Blog author for snippets"""
    
    name = models.CharField(max_length=100)
    website = models.URLField(blank=True, null=True)
    
    
class BlogDetailPage(Page):
    """Parental Blog Detail Page"""

	...
    
    content = StreamField(
        [
            ("title_and_text", blocks.TitleAndTextBlock()),
            ("full_richtext", blocks.RichtextBlock()),
            ("simple_richtext", blocks.SimpleRichtextBlock()),
            ("cards", blocks.CardBlock()),
            ("cta", blocks.CTABlock()),
        ],
        null=True,
        blank=True
    )
    
    api_fields = [
        APIField("blog_authors"),
        APIField("content"),
    ]

위와 같은 경우를 살펴보자. BlogAuthorsOrderable와 BlogDetailPage는 Wagtail의 모델인데 BlogAuthor은 Django 모델이다. 이럴경우 BlogAuthor 모델에서는 api_fields를 사용할 수 없다. 

 

그래서 @property를 통해 BlogAuthor 모델을 사용하는 BlogAuthorsOrderable에서 api_fields를 사용해야한다. 

 

    @property
    def author_name(self):
        return self.author.name
    
    @property
    def author_website(self):
        return self.author.website
    
    api_fields = [
        APIField('author_name'),
        APIField('author_website'),
    ]

 

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

Wagtail API v2 Image Rendition Field  (0) 2021.11.24
Wagtail API v2 Serializers  (0) 2021.11.24
Wagtail API v2 Fetching Fields  (0) 2021.11.24
Wagtail API v2 Exposing Custom Fields  (0) 2021.11.24
Wagtail API v2 Settings(Headless CMS)  (0) 2021.11.24

+ Recent posts