es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

API de Wagtail: cómo exponer fragmentos y serializar datos anidados

El problema es el siguiente, he creado un fragmento de código y quiero exponerlo, pero no sé cómo serializar datos anidados. Aquí está mi código:

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',
    ]

El resultado es:

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

¿Cómo puedo resolver este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para serializar datos anidados en Django, puedes usar los serializadores del Marco de Rest de Django.

    En primer lugar, debes importar los serializadores en tu archivo endpoints.py:

    from rest_framework import serializers
    

    Luego, puedes crear un serializador anidado para el modelo Task:

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

    A continuación, puedes modificar el TeamMemberAPIEndpoint para usar el TaskSerializer para el campo tasks:

    class TeamMemberAPIEndpoint(BaseAPIViewSet):
        model = TeamMember
    
        # Eliminar 'tasks' tanto en body_fields como en listing_default_fields
    
        # Agregar un atributo serializer_class
        serializer_class = serializers.ModelSerializer
    
        def get_serializer_class(self):
            if self.action == 'list':
                # Usar el NestedTaskSerializer anidado para la vista de lista
                return NestedTaskSerializer
            else:
                # Usar el serializador predeterminado para otras vistas
                return serializers.ModelSerializer
    
    class NestedTaskSerializer(serializers.ModelSerializer):
        # Usar el TaskSerializer para cada objeto task en el campo 'tasks'
        tasks = TaskSerializer(many=True)
    
        class Meta:
            model = TeamMember
            fields = ('name', 'description', 'tasks')
    

    Finalmente, puedes actualizar los atributos body_fields y listing_default_fields para eliminar ‘tasks’ ya que se incluirá en el serializador anidado.

    Al usar el NestedTaskSerializer, la respuesta JSON se verá así:

    {
        "items": [
            {
                "name": "equipo de python",
                "description": "",
                "tasks": [
                    {
                        "id": 1,
                        "task_name": "tarea 1"
                    },
                    {
                        "id": 2,
                        "task_name": "tarea 2"
                    }
                ]
            }
        ]
    }
    

    Esto te permite serializar correctamente datos anidados en Django Rest Framework.

Comments are closed.