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'),
]