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ícateSerializer 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
yupdate
.
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
yupdate
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.
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.
Introducción A Django
Introducción Y Entorno
Instalación Y Configuración Django Con Venv
Introducción Y Entorno
Arquitectura De Un Proyecto Django
Introducción Y Entorno
Base De Datos Mysql En Django
Modelos Y Base De Datos
Creación De Modelos
Modelos Y Base De Datos
Asociaciones De Modelos
Modelos Y Base De Datos
Migraciones
Modelos Y Base De Datos
Operaciones Crud Y Consultas
Modelos Y Base De Datos
Enrutamiento Básico
Vistas Y Plantillas
Plantillas Con Django Template Language
Vistas Y Plantillas
Vistas Basadas En Funciones
Vistas Y Plantillas
Vistas Basadas En Clases
Vistas Y Plantillas
Middlewares
Vistas Y Plantillas
Form Vs Modelform
Formularios
Procesamiento De Formularios
Formularios
Subida De Archivos
Formularios
Api Rest Con Django Rest Framework
Api Rest
Serializadores
Api Rest
Vistas Y Viewsets
Api Rest
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender las funciones de
Serializer
yModelSerializer
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.