Трясогузка получает все теги определенного типа страницы с помощью API - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь найти способ получить список тегов определенных типов страниц, используя wagtail api .

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

На документах ясно, что есть конечные точки для страниц, документов и изображений. Но я не смог найти информацию по тегам.

  1. Нужно ли создавать другую конкретную модель типа страницы, которая собирает все теги и отправляет их через конечную точку страниц?
  2. Или мне нужно добавить собственную конечную точку для модели тега?

1 Ответ

0 голосов
/ 05 июня 2019

Вам вообще не нужно создавать пользовательскую конечную точку 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
        }
    ]
}
...