我正在尝试找到一种使用 wagtail api 来获取特定页面类型的标记列表的方法。
class BlogPage(FreeFormPage):
#...
tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
class WorkPage(FreeFormPage):
#...
tags = ClusterTaggableManager(through=WorkPageTag, blank=True)
在文档上很明显,页面,文档和图像都有端点。但是我找不到有关标签的信息。
答案 0 :(得分:0)
您根本不需要创建自定义API端点。相反,您会告诉Django Rest Framework尝试序列化模型字段时返回什么。
下面是一个如何将自定义序列化程序与ClusterTaggableManager(tags
)配合使用的示例
from modelcluster.contrib.taggit import ClusterTaggableManager
from rest_framework.fields import Field
from wagtail.core.models import Page
from wagtail.api import APIField
class CustomTagSerializer(Field):
"""Custom Tag Serializer."""
def to_representation(self, value):
"""Loop through all the tags and return the name, slug and caption as a Dict."""
return [
{
"name": tag.name,
"slug": tag.slug,
"pk": tag.pk
}
for tag in value.all()
]
class BlogPage(Page):
"""Custom Wagtail Page with Tags."""
# ... other fields
tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
api_fields = [
APIField("title"),
# ... other fields to turn into JSON
APIField("tags", serializer=CustomTagSerializer()),
]
您将使用api_fields = [APIField(), APIField()...]
和一个serializer
类的Field
。在to_representation()
方法中,您可以遍历所有标记并返回字典列表(在上面的示例中,我已经写了一个列表理解)。
如果您打开localhost:8000 / api / v2 / pages / {page_id},您会看到与以下内容非常相似的JSON:
{
"id": 4,
"meta": {
"...": "...",
},
"title": "Blog Page",
"tags": [
{
"name": "Multiple worded tag",
"slug": "multiple-worded-tag",
"pk": 1
},
{
"name": "tag1",
"slug": "tag1",
"pk": 2
}
]
}