Wagtail api как раскрыть сниппеты и сериализовать вложенные данные

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

models.py

@register_snippet
class TeamMember(ClusterableModel):
    name = models.CharField(max_length=80)
    description = models.CharField(max_length=80)

    panels = [
        FieldPanel('name'),
        InlinePanel('tasks', label=('Tasks')),
    ]

class Task(Orderable):
    team_member = ParentalKey('adm.TeamMember', related_name="tasks")
    task_name = models.CharField(max_length=80)

endpoints.py

class TeamMemberAPIEndpoint(BaseAPIViewSet):

    model = TeamMember

    body_fields = BaseAPIViewSet.body_fields + [
        'name',
        'description',
        'tasks',
    ]

    listing_default_fields = BaseAPIViewSet.listing_default_fields = [
        'name',
        'description',
        'tasks',
    ]

результат:

    "items": [
        {
            "name": "python team",
            "description": "",
            "tasks": [
                {
                    "id": 1,
                    "meta": {
                        "type": "adm.Task"
                    }
                },
                {
                    "id": 2,
                    "meta": {
                        "type": "adm.Task"
                    }
                }
            ]
        }

как я могу решить эту проблему?

У вас есть несколько способов получить вложенные данные.

  1. обеспечить специальный сериализатор для вложенных элементов внутри конечной точки API.

  2. способ трясогузки. Определите дополнительные свойства api.


from rest_framework import serializers
from wagtail.api import APIField


class Task(Orderable):
    team_member = ParentalKey('adm.TeamMember', related_name="tasks")
    task_name = models.CharField(max_length=80)

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = (
            "id",
            "task_name",
        )

@register_snippet
class TeamMember(ClusterableModel):
    name = models.CharField(max_length=80)
    description = models.CharField(max_length=80)

    panels = [
        FieldPanel('name'),
        InlinePanel('tasks', label=('Tasks')),
    ]

   api_fields = [
        APIField("tasks", serializer=TaskSerializer(many=True)),
    ]

ответ выглядит следующим образом:

{
    "meta": {
        "total_count": 1
    },
    "items": [
        {
            "name": "Member 1",
            "tasks": [
                {
                    "id": 1,
                    "task_name": "Do this"
                },
                {
                    "id": 2,
                    "task_name": "Do that"
                }
            ]
        }
    ]
}
Вернуться на верх