Serializadores – Django REST Framework

Los serializadores en Django REST Framework son responsables de convertir objetos en tipos de datos comprensibles para javascript y marcos front-end. Los serializadores también brindan deserialización, lo que permite que los datos analizados se vuelvan a convertir en tipos complejos, después de validar primero los datos entrantes. Los serializadores en el marco REST funcionan de manera muy similar a las clases Form y ModelForm de Django. Los dos principales serializadores que se utilizan con más frecuencia son ModelSerializer e HyperLinkedModelSerialzer .
Este artículo gira en torno a cómo usar serializadores desde cero en Django REST Framework para campos y argumentos de serializadores avanzados. Se supone que uno está familiarizado con ¿Cómo iniciar un proyecto con Django REST Framework?

Creación y uso de serializadores

Creación de un serializador básico

Para crear un serializador básico, es necesario importar la clase de serializadores desde rest_framework y definir campos para un serializador como si se creara un formulario o modelo en Django. 

Ejemplo  

Python3

# import serializer from rest_framework
from rest_framework import serializers
 
# create a serializer
class CommentSerializer(serializers.Serializer):
    # initialize fields
    email = serializers.EmailField()
    content = serializers.CharField(max_length = 200)
    created = serializers.DateTimeField()

De esta manera, se puede declarar el serializador para cualquier entidad u objeto en particular según los campos requeridos. Los serializadores se pueden utilizar para serializar y deserializar los datos.

Uso de Serializer para serializar datos

Ahora se puede usar CommentSerializer para serializar un comentario o una lista de comentarios. Una vez más, usar la clase Serializer se parece mucho a usar una clase Form. Primero creemos una clase de comentario para crear un objeto de tipo comentario que pueda ser entendido por nuestro serializador.  

Python3

# import datetime object
from datetime import datetime
 
# create a class
class Comment(object):
    def __init__(self, email, content, created = None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()
# create a object
comment = Comment(email ='leila@example.com', content ='foo bar')

Ahora que nuestro objeto está listo, intentemos serializar este objeto de comentario. Ejecute el siguiente comando, 

Python manage.py shell

Ahora ejecuta el siguiente código  

# import comment serializer
>>> from apis.serializers import CommentSerializer

# import datetime for date and time
>>> from datetime import datetime

# create a object
>>> class Comment(object):
...     def __init__(self, email, content, created=None):
...         self.email = email
...         self.content = content
...         self.created = created or datetime.now()
... 

# create a comment object
>>> comment = Comment(email='leila@example.com', content='foo bar')

# serialize the data
>>> serializer = CommentSerializer(comment)

# print serialized data
>>> serializer.data

Ahora vamos a comprobar la salida de esto, 

creating-a-serializer

Para obtener más información sobre cómo crear y usar un serializador, visite: Creación y uso de serializadores

ModelSerializerModelSerializer

La clase ModelSerializer proporciona un atajo que le permite crear automáticamente una clase Serializer con campos que corresponden a los campos del Modelo. 

La clase ModelSerializer es la misma que una clase Serializer regular, excepto que: 

  • Generará automáticamente un conjunto de campos para usted, según el modelo.
  • Generará automáticamente validadores para el serializador, como validadores únicos_juntos.
  • Incluye implementaciones predeterminadas simples de .create() y .update().

Sintaxis –  

Python3

class SerializerName(serializers.ModelSerializer):
    class Meta:
        model = ModelName
        fields = List of Fields

Ejemplo – 

Python3

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

De forma predeterminada, todos los campos del modelo en la clase se asignarán a los campos del serializador correspondiente. 
Para ver cómo usar ModelSerializer en su proyecto, visite – ModelSerializer en serializadores – Django REST Framework

HyperlinkedModelSerializerHyperlinkedModelSerializer

La clase HyperlinkedModelSerializer es similar a la clase ModelSerializer excepto que usa hipervínculos para representar relaciones, en lugar de claves principales. De forma predeterminada, el serializador incluirá un campo de URL en lugar de un campo de clave principal. El campo URL se representará mediante un campo serializador HyperlinkedIdentityField y cualquier relación en el modelo se representará mediante un campo serializador HyperlinkedRelatedField.

Sintaxis –  

Python3

class SerializerName(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = ModelName
        fields = List of Fields

Ejemplo – 

Python3

class AccountSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

Para ver cómo usar HyperLinkedModelSerializer en su proyecto, visite – HyperlinkedModelSerializer en serializadores – Django REST Framework .
 

Campos del serializador

Nombre del campo Descripción
campo booleano Un campo booleano utilizado para envolver valores verdaderos o falsos.
NullBooleanField Un campo booleano que acepta valores True, False y Null.
CharField CharField se utiliza para almacenar la representación de texto.
Campo de correo electrónico EmailField también es una representación de texto y valida el texto para que sea una dirección de correo electrónico válida.
RegexField Como lo define el nombre, RegexField hace coincidir la string con una expresión regular en particular; de lo contrario, genera un error.
campo URL URLField es básicamente un RegexField que valida la entrada contra un patrón de coincidencia de URL.
campo de babosas SlugField es un RegexField que valida la entrada contra el patrón [a-zA-Z0-9_-]+.
CampoDirecciónIP IPAddressField es un campo que garantiza que la entrada sea una string IPv4 o IPv6 válida.
CampoEntero IntegerField es básicamente un campo entero que valida la entrada contra la instancia int de Python.
campo flotante FloatField es básicamente un campo flotante que valida la entrada contra la instancia flotante de Python.
campo decimal DecimalField es básicamente un campo decimal que valida la entrada contra la instancia decimal de Python.
Campo de fecha y hora DateTimeField es un campo serializador utilizado para la representación de fecha y hora.
campo de fecha DateField es un campo serializador utilizado para la representación de fechas.
Campo de tiempo Timefield es un campo serializador utilizado para la representación del tiempo.
DuraciónCampo DurationField es un campo serializador utilizado para la representación de la duración.
campo de elección ChoiceField es básicamente un CharField que valida la entrada contra un valor de un conjunto limitado de opciones.
campo de opción múltiple MultipleChoiceField es básicamente un CharField que valida la entrada contra un conjunto de cero, uno o muchos valores, elegidos de un conjunto limitado de opciones.
campo de archivo FileField es básicamente una representación de archivo. Realiza la validación estándar de FileField de Django.
campo de imagen ImageField es una representación de imagen. Valida que el contenido del archivo cargado coincida con un formato de imagen conocido.
Campo de lista ListField es básicamente un campo de lista que valida la entrada contra una lista de objetos.
campo JSON JSONField es básicamente una clase de campo que valida que la estructura de datos entrantes consiste en primitivas JSON válidas.
Campo escondido HiddenField es una clase de campo que no toma un valor basado en la entrada del usuario, sino que toma su valor de un valor predeterminado o invocable.
DictField DictField es básicamente un campo de diccionario que valida la entrada contra un diccionario de objetos.

Argumentos centrales en los campos del serializador

Los campos del serializador en Django son los mismos que los campos de formulario de Django y los campos de modelo de Django y, por lo tanto, requieren ciertos argumentos para manipular el comportamiento de esos campos. 

Argumento Descripción
solo lectura Establézcalo en True para asegurarse de que el campo se use al serializar una representación, pero no al crear o actualizar una instancia durante la deserialización.
escribir solamente Establézcalo en True para asegurarse de que el campo se pueda usar al actualizar o crear una instancia, pero no se incluya al serializar la representación.
requerido Establecer esto en False también permite omitir el atributo del objeto o la clave del diccionario de la salida al serializar la instancia.
defecto Si se establece, proporciona el valor predeterminado que se utilizará para el campo si no se proporciona ningún valor de entrada.
permitir nula Normalmente, se generará un error si se pasa Ninguno a un campo serializador. Establezca este argumento de palabra clave en Verdadero si Ninguno debe considerarse un valor válido.
fuente El nombre del atributo que se utilizará para rellenar el campo.
validadores Una lista de funciones de validación que deben aplicarse a la entrada de campo entrante y que generan un error de validación o simplemente regresan.
error de mensajes Un diccionario de códigos de error a mensajes de error.
etiqueta Una string de texto corta que se puede usar como el nombre del campo en campos de formulario HTML u otros elementos descriptivos.
texto de ayuda Una string de texto que se puede utilizar como descripción del campo en campos de formulario HTML u otros elementos descriptivos.
inicial Un valor que debe usarse para completar previamente el valor de los campos de formulario HTML.

Publicación traducida automáticamente

Artículo escrito por NaveenArora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *