Django

Django

Tutorial Django: Serializadores

Django REST Framework: diferencias entre Serializer y ModelSerializer y cuándo usar cada uno. Flexibilidad vs simplicidad en serialización de datos.

Aprende Django y certifícate

Serializer vs ModelSerializer

En Django REST Framework, los serializadores son herramientas que permiten la conversión de datos complejos, como instancias de modelos de Django, en formatos nativos de Python que pueden ser fácilmente renderizados en formatos como JSON o XML. Existen dos tipos principales de serializadores: Serializer y ModelSerializer.

El Serializer es la clase base que proporciona un control detallado y granular sobre cómo se manejan los datos. Permite definir explícitamente cada campo y las operaciones de lectura y escritura asociadas. Por ejemplo:

from rest_framework import serializers
from .models import Libro, Autor, Categoria

# Otros serializers ...

class LibroSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    titulo = serializers.CharField(max_length=200)
    descripcion = serializers.CharField(max_length=1000)
    leido = serializers.BooleanField(default=False)
    publicacion = serializers.DateField()
    autor = AutorSerializer(required=False)
    categorias = CategoriaSerializer(many=True)
    portada = serializers.ImageField()

    def create(self, validated_data):
        return Libro.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.titulo = validated_data.get("titulo", instance.titulo)
        instance.descripcion = validated_data.get("descripcion", instance.descripcion)
        instance.leido = validated_data.get("leido", instance.leido)
        instance.publicacion = validated_data.get("publicacion", instance.publicacion)
        instance.autor = validated_data.get("autor", instance.autor)
        instance.categorias = validated_data.get("categorias", instance.categorias)
        instance.portada = validated_data.get("portada", instance.portada)
        instance.save()
        return instance

Por otro lado, el ModelSerializer es una clase que hereda de Serializer y está optimizada para trabajar directamente con modelos de Django. Automatiza la creación de campos basándose en los campos del modelo y proporciona implementaciones predeterminadas de los métodos create y update. Un ejemplo sería:

from rest_framework import serializers
from .models import Libro

class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = '__all__'

Diferencias clave entre Serializer y ModelSerializer:

Declaración de campos: En Serializer, los campos se definen manualmente, ofreciendo flexibilidad para personalizar cada uno. En ModelSerializer, los campos se generan automáticamente a partir del modelo, lo que simplifica el código y reduce la repetición.

Implementación de métodos: ModelSerializer proporciona implementaciones predeterminadas de los métodos create y update, basadas en el modelo asociado. Con Serializer, es necesario definir estos métodos si se desea soporte completo de operaciones de escritura.

Opciones adicionales: ModelSerializer permite utilizar todas las funcionalidades de los ModelForm, como la clase Meta, incluyendo opciones como fields, exclude y read_only_fields, lo que facilita la configuración de los serializadores.

Cuándo usar Serializer:

  • Cuando se necesita un control detallado sobre los campos y su comportamiento.
  • Si el serializador no está directamente vinculado a un modelo de Django.
  • Para serializar datos que provienen de múltiples fuentes o combinan varios modelos.

Cuándo usar ModelSerializer:

  • Al crear una API para un modelo existente de Django.
  • Cuando se busca reducir la cantidad de código repetitivo.
  • Si se desea aprovechar las implementaciones predeterminadas de create y update.

Elegir entre Serializer y ModelSerializer depende de las necesidades específicas del proyecto. Mientras que ModelSerializer es ideal para prototipos rápidos y casos en los que se trabaja directamente con modelos de Django, Serializer ofrece la flexibilidad necesaria para escenarios más complejos donde se requiere un control total sobre el proceso de serialización.

Validaciones

En los serializadores de Django REST Framework, las validaciones son fundamentales para garantizar la integridad y consistencia de los datos que se reciben y envían a través de la API. Los serializadores proporcionan múltiples formas de validar datos, desde validaciones a nivel de campo hasta validaciones a nivel de objeto, permitiendo implementar reglas de negocio complejas.

Validaciones a nivel de campo:

Las validaciones a nivel de campo se aplican individualmente a cada campo del serializador. Para ello, se puede utilizar el argumento validators en la definición del campo o implementar el método validate_<nombre_campo>. Por ejemplo:

from rest_framework import serializers
from .models import Autor

def validar_nombre_unico(value):
    if Autor.objects.filter(nombre=value).exists():
        raise serializers.ValidationError("El nombre ya existe.")
    return value

class AutorSerializer(serializers.ModelSerializer):
    nombre = serializers.CharField(
        max_length=255,
        validators=[validar_nombre_unico]
    )

    class Meta:
        model = Libro
        fields = "__all__"

    def validate_edad(self, value):
        if value > 130:
            raise serializers.ValidationError("La edad debe ser menor a 130.")
        return value

En este ejemplo, se ha definido una función validar_nombre_unico que verifica si el nombre del autor ya existe en la base de datos, y se utiliza el método validate_edad para asegurar que la edad del autor sea menor que 130.

Validaciones a nivel de objeto:

Las validaciones a nivel de objeto permiten comprobar relaciones entre varios campos del serializador. Se implementan sobreescribiendo el método validate del serializador. Por ejemplo:

class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = ['id', 'titulo', 'autor', 'publicado_en', 'fecha_edicion']

    def validate(self, data):
        if data['publicado_en'] > data['fecha_edicion']:
            raise serializers.ValidationError("La fecha de edición no puede ser anterior a la de publicación.")
        return data

Aquí, se verifica que la fecha_edicion no sea anterior a publicado_en, garantizando la coherencia temporal de las fechas.

Validadores integrados y personalizados:

Django REST Framework ofrece una variedad de validadores integrados que pueden ser utilizados directamente. Algunos ejemplos son UniqueValidator, RegexValidator y EmailValidator. Para utilizarlos:

from rest_framework.validators import UniqueValidator

class UsuarioSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        validators=[UniqueValidator(queryset=Usuario.objects.all())]
    )

    class Meta:
        model = Usuario
        fields = ['id', 'username', 'email', 'password']

En este caso, se asegura que el campo email sea único en el modelo Usuario, evitando registros duplicados.

También es posible crear validadores personalizados como clases que implementan el método __call__. Por ejemplo:

from rest_framework.validators import ValidationError

class ValidarEmailDominio:
    def __init__(self, dominio):
        self.dominio = dominio

    def __call__(self, value):
        if not value.endswith('@' + self.dominio):
            raise ValidationError(f"El correo debe pertenecer al dominio {self.dominio}.")

class UsuarioSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        validators=[ValidarEmailDominio('empresa.com')]
    )

    class Meta:
        model = Usuario
        fields = ['id', 'username', 'email', 'password']

Con este validador, se verifica que el correo electrónico pertenezca a un dominio específico, cumpliendo con políticas corporativas.

Validaciones condicionales:

A veces es necesario aplicar validaciones basadas en condiciones o estados particulares. Esto se puede lograr dentro del método validate o en los métodos validate_<nombre_campo>. Por ejemplo:

class PedidoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pedido
        fields = ['id', 'cliente', 'estado', 'fecha_envio']

    def validate_fecha_envio(self, value):
        estado = self.initial_data.get('estado')
        if estado == 'enviado' and not value:
            raise serializers.ValidationError("Debe proporcionar una fecha de envío si el estado es 'enviado'.")
        return value

Este código garantiza que si el pedido está en estado 'enviado', entonces la fecha_envio es obligatoria.

Errores de validación:

Cuando una validación falla, se lanza una excepción ValidationError, y el error se incluye en la respuesta de la API. Es importante proporcionar mensajes de error claros y precisos para facilitar la corrección por parte del usuario.

Resumen de buenas prácticas:

  • Centralizar las validaciones en los serializadores para mantener un código más limpio y coherente.
  • Utilizar validadores integrados siempre que sea posible para aprovechar funcionalidades existentes.
  • Implementar validaciones personalizadas cuando se requiera lógica específica de negocio.
  • Proporcionar mensajes de error informativos y respetuosos que guíen al usuario.

Consideraciones sobre rendimiento:

Las validaciones pueden afectar el rendimiento si implican consultas adicionales a la base de datos. Es recomendable optimizar las consultas y, si es posible, realizar validaciones en memoria antes de acceder a la base de datos.

Integración con el modelo:

Los ModelSerializer también respetan las validaciones definidas en los modelos de Django, incluyendo restricciones de campo y métodos clean(). Sin embargo, las validaciones en los serializadores ofrecen una capa adicional para manejos específicos de la API.

Serializadores anidados y relaciones

En Django REST Framework, los serializadores anidados y las relaciones entre modelos son esenciales para representar estructuras de datos complejas y reflejar las asociaciones definidas en los modelos de Django. Los serializadores proporcionan herramientas para manejar eficientemente estas relaciones, permitiendo una comunicación clara y estructurada entre el servidor y el cliente.

Tipos de relaciones en Django:

  • OneToOneField: relación uno a uno.
  • ForeignKey: relación muchos a uno.
  • ManyToManyField: relación muchos a muchos.

Serialización de relaciones:

Para serializar modelos relacionados, se pueden utilizar diferentes tipos según sea necesario.

Uso de representaciones planas (PrimaryKeyRelatedField):

Este método serializa las relaciones referenciando únicamente las claves primarias de los objetos relacionados. Es útil para reducir la carga de datos y simplificar las respuestas.

from rest_framework import serializers
from .models import Autor, Libro

class LibroSerializer(serializers.ModelSerializer):
    autor = serializers.PrimaryKeyRelatedField(queryset=Autor.objects.all())

    class Meta:
        model = Libro
        fields = "__all__"

En este ejemplo, el campo autor se representa mediante su clave primaria. Al serializar un Libro, el campo autor contendrá el ID del autor asociado.

Uso de representaciones anidadas (Nested Relationships):

Con los serializadores anidados, se incluye toda la información del objeto relacionado dentro de la representación del objeto principal.

class AutorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Autor
        fields = "__all__"

class LibroSerializer(serializers.ModelSerializer):
    autor = AutorSerializer()

    class Meta:
        model = Libro
        fields = "__all__"

Aquí, el AutorSerializer se anida dentro del LibroSerializer, permitiendo que los detalles completos del autor estén disponibles al serializar un Libro.

Uso de representaciones personalizadas (SlugRelatedField):

Se puede optar por representar el objeto relacionado mediante un campo descriptivo, como un nombre o un slug.

class LibroSerializer(serializers.ModelSerializer):
    autor = serializers.SlugRelatedField(queryset=Autor.objects.all(), slug_field='nombre')

    class Meta:
        model = Libro
        fields = "__all__"

En este caso, el campo autor se representará por el campo nombre del modelo Autor.

Serialización de relaciones ManyToMany:

Las relaciones ManyToMany pueden manejarse de manera similar, utilizando campos específicos para este tipo de relaciones.

from .models import Libro, Categoria

class CategoriaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categoria
        fields = "__all__"

class LibroSerializer(serializers.ModelSerializer):
    categorias = CategoriaSerializer(many=True)

    class Meta:
        model = Libro
        fields = "__all__"

Al establecer el parámetro many=True en el CategoriaSerializer, se indica que el campo categorias es una lista de objetos Categoria.

Escritura con serializadores anidados:

Cuando se utilizan serializadores anidados para operaciones de escritura (crear o actualizar), es necesario sobrescribir los métodos create y update para manejar adecuadamente los datos anidados.

class LibroSerializer(serializers.ModelSerializer):
    autor = AutorSerializer(read_only=True)
    categorias = CategoriaSerializer(many=True, read_only=True)

    class Meta:
        model = Libro
        fields = "__all__"

    def create(self, validated_data):
        categorias_data = validated_data.pop("categorias")
        autor_data = validated_data.pop("autor")
        libro = Libro.objects.create(**validated_data)
        libro.categorias.set(categorias_data)
        libro.autor = autor_data
        return libro

    def update(self, instance, validated_data):
        categorias_data = validated_data.pop("categorias")

        instance.titulo = validated_data.get("titulo", instance.titulo)
        instance.descripcion = validated_data.get("descripcion", instance.descripcion)
        instance.leido = validated_data.get("leido", instance.leido)
        instance.publicacion = validated_data.get("publicacion", instance.publicacion)
        instance.autor = validated_data.get("autor", instance.autor)
        instance.portada = validated_data.get("portada", instance.portada)
        instance.save()

        instancia_categorias = []
        for categoria_data in categorias_data:
            categoria, created = Categoria.objects.get_or_create(**categoria_data)
            instancia_categorias.append(categoria)
        instance.categorias.set(instancia_categorias)
        return instance

En este ejemplo, al crear o actualizar un Libro, se manejan los datos anidados de categorias, asegurando que las categorías se creen o recuperen adecuadamente y se asocien al libro.

Consideraciones sobre el rendimiento:

El uso excesivo de serializadores anidados puede impactar negativamente en el rendimiento de la API, especialmente cuando se serializan grandes conjuntos de datos o relaciones profundas. Para mitigar este efecto, se pueden utilizar técnicas como:

  • select_related y prefetch_related: optimizan las consultas a la base de datos.
class LibroViewSet(viewsets.ModelViewSet):
    queryset = Libro.objects.all().select_related('autor').prefetch_related('categorias')
    serializer_class = LibroSerializer
  • Limitar la profundidad de anidamiento: mediante el atributo depth en el serializador.
class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = "__all__"
        depth = 1

El atributo depth permite serializar automáticamente los objetos relacionados hasta el nivel indicado, pero se debe usar con precaución debido al potencial impacto en el rendimiento.

Relaciones recursivas y autorreferenciadas:

En casos donde un modelo tiene una relación consigo mismo, se pueden implementar serializadores para manejar estas relaciones recursivas.

class CategoriaSerializer(serializers.ModelSerializer):
    subcategorias = serializers.SerializerMethodField()

    class Meta:
        model = Categoria
        fields = ['id', 'nombre', 'subcategorias']

    def get_subcategorias(self, obj):
        hijos = obj.subcategorias.all()
        return CategoriaSerializer(hijos, many=True).data

Aquí, cada Categoria incluye sus subcategorias anidadas, permitiendo una representación jerárquica.

Uso de HyperlinkedModelSerializer:

Para crear APIs RESTful más alineadas con HATEOAS, se puede utilizar HyperlinkedModelSerializer, que representa las relaciones mediante URLs en lugar de IDs.

class LibroSerializer(serializers.HyperlinkedModelSerializer):
    autor = serializers.HyperlinkedRelatedField(view_name='autor-detail', read_only=True)

    class Meta:
        model = Libro
        fields = ['url', 'id', 'titulo', 'descripcion', 'publicacion']

En este caso, el campo autor proporcionará la URL del detalle del autor en lugar de su identificador.

Personalización avanzada de serializadores anidados:

Es posible personalizar los campos mostrados en los serializadores anidados o aplicar filtros específicos.

class AutorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Autor
        fields = ['id', 'nombre']

class LibroSerializer(serializers.ModelSerializer):
    autor = AutorSerializer(read_only=True)
    autor_id = serializers.PrimaryKeyRelatedField(write_only=True, source='autor', queryset=Autor.objects.all())

    class Meta:
        model = Libro
        fields = ['id', 'titulo', 'autor', 'autor_id', 'publicacion']

Con esta configuración, al serializar un Libro, se muestran los detalles del autor, pero al crear o actualizar, se puede proporcionar únicamente el autor_id.

Funciones create y update

En los serializadores de Django REST Framework, las funciones create() y update() son esenciales para determinar cómo se crean y actualizan las instancias de los modelos a partir de los datos validados. Estas funciones permiten controlar el comportamiento de las operaciones de escritura y adaptar la lógica a las necesidades específicas de la aplicación.

La función create se utiliza para definir cómo se crea una nueva instancia del modelo cuando se reciben datos nuevos a través de la API. Por defecto, en un ModelSerializer, esta función simplemente llama al método create del modelo con los datos validados. Sin embargo, en situaciones donde se requiere una lógica personalizada, es necesario sobrescribir esta función.

class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = ["titulo", "descripcion", "leido", "publicacion", "autor", "categorias", "portada"]

    def create(self, validated_data):
        return Libro.objects.create(**validated_data)

En este ejemplo, la función create utiliza los datos validados para crear una nueva instancia de Libro. Si se necesitan realizar acciones adicionales, como establecer valores por defecto o manipular los datos antes de la creación, se pueden agregar dentro de esta función.

Personalización de la función create

Supongamos que queremos asociar el autor actual al libro que se está creando. Podemos acceder al contexto del serializador y modificar la función create de la siguiente manera:

class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = ["titulo", "descripcion", "leido", "publicacion", "autor", "categorias", "portada"]

    def create(self, validated_data):
        autor = self.context["request"].user
        return Libro.objects.create(autor=autor, **validated_data)

Aquí, estamos añadiendo el usuario como campo adicional al crear el libro, asegurando que cada libro esté vinculado al usuario que lo creó.

La función update

La función update define cómo se actualizan las instancias existentes del modelo con los nuevos datos validados. En un ModelSerializer, la implementación por defecto actualiza los campos directamente. Sin embargo, al igual que con create, se puede sobrescribir para agregar lógica personalizada.

class AutorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Autor
        fields = ["nombre", "edad"]

    def update(self, instance, validated_data):
        instance.nombre = validated_data.get("nombre", instance.nombre)
        instance.edad = validated_data.get("edad", instance.edad)
        instance.save()
        return instance

En este código, cada campo del instance se actualiza solo si está presente en validated_data, manteniendo su valor actual en caso contrario.

Manejo de relaciones en create y update

Cuando se trabaja con relaciones, especialmente con campos anidados o de tipo ManyToMany, es común que se necesite una lógica más compleja en las funciones create y update.

Por ejemplo, si se trata de asignar múltiples categorías a un Libro:

class LibroSerializer(serializers.ModelSerializer):
    autor = AutorSerializer(read_only=True)
    categorias = CategoriaSerializer(many=True, read_only=True)

    class Meta:
        model = Libro
        fields = "__all__"

    def create(self, validated_data):
        categorias_data = validated_data.pop("categorias")
        autor_data = validated_data.pop("autor")
        libro = Libro.objects.create(**validated_data)
        libro.categorias.set(categorias_data)
        libro.autor = autor_data
        return libro

    def update(self, instance, validated_data):
        categorias_data = validated_data.pop("categorias")

        instance.titulo = validated_data.get("titulo", instance.titulo)
        instance.descripcion = validated_data.get("descripcion", instance.descripcion)
        instance.leido = validated_data.get("leido", instance.leido)
        instance.publicacion = validated_data.get("publicacion", instance.publicacion)
        instance.autor = validated_data.get("autor", instance.autor)
        instance.portada = validated_data.get("portada", instance.portada)
        instance.save()

        instancia_categorias = []
        for categoria_data in categorias_data:
            categoria, created = Categoria.objects.get_or_create(**categoria_data)
            instancia_categorias.append(categoria)
        instance.categorias.set(instancia_categorias)
        return instance

De esta manera, se asegura que las categorías asociadas al libro se gestionen correctamente durante las operaciones de creación y actualización.

Uso de archivos y datos extra

Si el modelo incluye campos de tipo FileField o ImageField, o se necesita procesar datos adicionales no incluidos directamente en los campos del modelo, es necesario manejarlos explícitamente en las funciones create y update.

class DocumentoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Documento
        fields = ['id', 'titulo', 'archivo']

    def create(self, validated_data):
        archivo = validated_data.pop('archivo')
        documento = Documento.objects.create(**validated_data)
        documento.archivo.save(archivo.name, archivo)
        return documento

Aquí, se maneja el archivo subido, asegurando que se guarde correctamente en el sistema de archivos.

Acceso al contexto del serializador

El contexto proporciona información adicional al serializador, como la solicitud actual o la vista. Esto puede ser útil en las funciones create y update para tomar decisiones basadas en el contexto.

class ComentarioSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comentario
        fields = ['id', 'contenido', 'fecha_creacion']

    def create(self, validated_data):
        usuario = self.context['request'].user
        articulo_id = self.context['view'].kwargs['articulo_pk']
        articulo = Articulo.objects.get(pk=articulo_id)
        return Comentario.objects.create(usuario=usuario, articulo=articulo, **validated_data)

En este ejemplo, el serializador utiliza información de la solicitud y de la URL para asociar el comentario al artículo correcto y al usuario que lo creó.

Consideraciones sobre transacciones y atomicidad

Al realizar operaciones que involucran múltiples acciones de base de datos, es importante asegurar la integridad de los datos utilizando transacciones.

from django.db import transaction

class LibroSerializer(serializers.ModelSerializer):
    autor = AutorSerializer(read_only=True)
    categorias = CategoriaSerializer(many=True, read_only=True)

    class Meta:
        model = Libro
        fields = "__all__"

    @transaction.atomic
    def create(self, validated_data):
        categorias_data = validated_data.pop("categorias")
        autor_data = validated_data.pop("autor")
        libro = Libro.objects.create(**validated_data)
        libro.categorias.set(categorias_data)
        libro.autor = autor_data
        return libro

La decoración @transaction.atomic asegura que todas las operaciones dentro de la función create se ejecuten dentro de una transacción, evitando estados inconsistentes en caso de errores.

Optimización y eficiencia

Es fundamental considerar el rendimiento al sobrescribir las funciones create y update. Evitar consultas innecesarias y utilizar métodos eficientes como bulk_create cuando sea posible.

class PedidoSerializer(serializers.ModelSerializer):
    libros = LibroSerializer(many=True)

    class Meta:
        model = Pedido
        fields = ['id', 'cliente', 'libros', 'fecha_pedido']

    @transaction.atomic
    def create(self, validated_data):
        libros_data = validated_data.pop('libros')
        pedido = Pedido.objects.create(**validated_data)
        libros = [Libro(pedido=pedido, **data) for data in libros_data]
        Libro.objects.bulk_create(libros)
        return pedido

En este caso, se utiliza bulk_create para insertar múltiples libros en una sola operación de base de datos, mejorando la eficiencia.

Gestionar excepciones y errores

Es importante manejar adecuadamente las excepciones dentro de las funciones create y update para proporcionar respuestas claras y evitar fallos inesperados.

class ReservaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reserva
        fields = ['id', 'cliente', 'fecha', 'habitacion']

    def create(self, validated_data):
        try:
            return Reserva.objects.create(**validated_data)
        except Exception as e:
            raise serializers.ValidationError(f"Error al crear la reserva: {str(e)}")

Al capturar excepciones, se pueden transformar en ValidationError, proporcionando mensajes útiles al cliente de la API.

Las mejores prácticas

  • Sobrescribir las funciones create y update solo cuando sea necesario.
  • Utilizar el contexto del serializador para acceder a información adicional.
  • Manejar las relaciones y campos anidados de manera explícita.
  • Asegurar la atomicidad y consistencia de las operaciones de base de datos.
  • Optimizar las consultas para mejorar el rendimiento.
  • Proporcionar un manejo adecuado de excepciones y errores.

Al comprender y utilizar correctamente las funciones create y update, se puede personalizar el comportamiento de los serializadores para satisfacer los requisitos específicos de la aplicación, garantizando una API robusta y eficiente.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con los certificados de CertiDevs.

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende Django online

Todas las lecciones de Django

Accede a todas las lecciones de Django y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Django y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender las funciones de Serializer y ModelSerializer en Django REST Framework.
  • Aprender a implementar una clase Serializer manualmente.
  • Aprender a usar ModelSerializer para simplificar serializaciones basadas en modelos.
  • Descubrir las diferencias clave y cuándo aplicar cada tipo.
  • Detectar escenarios prácticos para elegir entre flexibilidad y simplicidad.