g使用API​​获取标签列表

时间:2019-06-01 17:10:27

标签: wagtail django-taggit wagtail-apiv2

我正在尝试找到一种使用 wagtail api 来获取特定页面类型的标记列表的方法。

 class BlogPage(FreeFormPage):
        #...
        tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
 class WorkPage(FreeFormPage):
        #...
        tags = ClusterTaggableManager(through=WorkPageTag, blank=True)

在文档上很明显,页面,文档和图像都有端点。但是我找不到有关标签的信息。

  1. 我是否需要创建另一个特定的页面类型模型来收集所有标签并通过页面终结点发送它们?
  2. 还是我必须为标记模型添加自定义端点?

1 个答案:

答案 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
        }
    ]
}