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