En Django REST Framework, el concepto mismo de Serialización es convertir datos de base de datos a un tipo de datos que pueda ser utilizado por javascript. Cada serializador viene con algunos campos (entradas) que se van a procesar. Por ejemplo, si tiene una clase con el nombre Employee y sus campos como Employee_id, Employee_name, date, etc. Entonces, necesitará AutoField, CharField y DateField para almacenar y manipular datos a través de Django. De manera similar, el serializador también funciona con el mismo principio y tiene campos que se usan para crear un serializador.
Este artículo gira en torno a los campos de fecha y hora en serializadores en Django REST Framework. Hay cuatro campos principales: DateTimeField, DateField, TimeField y DurationField.
Campo de fecha y hora
DateTimeField es un campo serializador utilizado para la representación de fecha y hora. Es lo mismo que – DateTimeField – Django Models
Tiene los siguientes argumentos –
- formato : una string que representa el formato de salida. Si no se especifica, el valor predeterminado es el mismo que la clave de configuración DATETIME_FORMAT, que será ‘iso-8601’ a menos que se establezca. El establecimiento de una string de formato indica que los valores de retorno de to_representation deben forzarse a una salida de string. Las strings de formato se describen a continuación. Establecer este valor en Ninguno indica que los objetos de fecha y hora de Python deben ser devueltos por to_representation. En este caso, el renderizador determinará la codificación de fecha y hora.
- input_formats : una lista de strings que representan los formatos de entrada que se pueden usar para analizar la fecha. Si no se especifica, se utilizará la configuración DATETIME_INPUT_FORMATS, cuyo valor predeterminado es [‘iso-8601’].
- default_timezone : un pytz.timezone que representa la zona horaria. Si no se especifica y la configuración USE_TZ está habilitada, el valor predeterminado es la zona horaria actual. Si USE_TZ está deshabilitado, los objetos de fecha y hora serán ingenuos.
Sintaxis –
field_name = serializers.DateTimeField(*args, **kwargs)
campo de fecha
DateField es un campo serializador utilizado para la representación de fechas. A menudo, uno necesita almacenar la fecha, como en un modelo de blog, la fecha de cada publicación debe almacenarse. Este campo es igual que DateField – Django Models
Tiene los siguientes argumentos –
- formato : una string que representa el formato de salida. Si no se especifica, el valor predeterminado es el mismo que la clave de configuración DATE_FORMAT, que será ‘iso-8601’ a menos que se establezca. El establecimiento de una string de formato indica que los valores de retorno de to_representation deben forzarse a una salida de string. Las strings de formato se describen a continuación. Establecer este valor en Ninguno indica que to_representation debe devolver los objetos de fecha de Python. En este caso, el renderizador determinará la codificación de la fecha.
- input_formats : una lista de strings que representan los formatos de entrada que se pueden usar para analizar la fecha. Si no se especifica, se utilizará la configuración DATE_INPUT_FORMATS, cuyo valor predeterminado es [‘iso-8601’].
Sintaxis –
field_name = serializers.DateField(*args, **kwargs)
Campo de tiempo
Timefield es un campo serializador utilizado para la representación del tiempo. A menudo, es necesario almacenar la fecha, como en un modelo de blog, se debe almacenar la hora de cada publicación.
Tiene los siguientes argumentos:
- formato : una string que representa el formato de salida. Si no se especifica, el valor predeterminado es el mismo que la clave de configuración TIME_FORMAT, que será ‘iso-8601’ a menos que se establezca. El establecimiento de una string de formato indica que los valores de retorno de to_representation deben forzarse a una salida de string. Las strings de formato se describen a continuación. Establecer este valor en Ninguno indica que los objetos de tiempo de Python deben ser devueltos por to_representation. En este caso, la codificación de tiempo será determinada por el renderizador.
- input_formats : una lista de strings que representan los formatos de entrada que se pueden usar para analizar la fecha. Si no se especifica, se utilizará la configuración TIME_INPUT_FORMATS, que por defecto es [‘iso-8601’].
Sintaxis –
field_name = serializers.TimeField(*args, **kwargs)
DuraciónCampo
DurationField es un campo serializador utilizado para la representación de la duración. Este campo es el mismo que DurationField – Django Models
Tiene los siguientes argumentos –
- max_value Valida que la duración proporcionada no sea mayor que este valor.
- min_value Valida que la duración proporcionada no sea inferior a este valor.
Sintaxis –
field_name = serializers.DurationField(*args, **kwargs)
¿Cómo usar los campos de fecha y hora en los serializadores?
Para explicar el uso de los campos de fecha y hora, usemos la misma configuración de proyecto de: ¿Cómo crear una API básica usando Django Rest Framework? .
Ahora que tiene un archivo llamado serializadores en su proyecto, creemos un serializador con DatetimeField, DateField, TimeField y DurationField.
Python3
# import serializer from rest_framework from rest_framework import serializers class Geeks(object): def __init__(self, date_time, date, time, duration): self.date_time = date_time self.date = date self.time = time self.duration = duration # create a serializer class GeeksSerializer(serializers.Serializer): # initialize fields date_time = serializers.DateTimeField() date = serializers.DateField() time = serializers.TimeField() duration = serializers.DurationField()
Ahora vamos a crear algunos objetos e intentar serializarlos y verificar si realmente funcionan, Ejecutar, –
Python manage.py shell
Ahora, ejecute los siguientes comandos de python en el shell
# import everything from datetime >>> from datetime import * # import everything from serializers >>> from apis.serializers import * # create a object of type Geeks >>> obj = Geeks(datetime.now(), date.today(), time(), timedelta(days=-1)) # serialize the object >>> serializer = GeeksSerializer(obj) # print serialized data >>> serializer.data {'date_time': '2020-03-22T13:17:27.853707Z', 'date': '2020-03-22', 'time': '00:00:00', 'duration': '-1 00:00:00'}
Aquí está el resultado de todas estas operaciones en la terminal:
Validación en campos de fecha y hora
Tenga en cuenta que el lema principal de estos campos es impartir validaciones, como DateField valida los datos solo hasta la fecha. Verifiquemos si estas validaciones funcionan o no:
# Create a dictionary and add invalid values >>> data={} >>> data['date_time'] = "invalid_date_time" >>> data['date'] = date.today() >>> data['time'] = time() >>> data['duration'] = "invalid_duration" # dictionary created >>> data {'date_time': 'invalid_date_time', 'date': datetime.date(2020, 3, 22), 'time': datetime.time(0, 0), 'duration': 'invalid_duration'} # deserialize the data >>> serializer = GeeksSerializer(data=data) # check if data is valid >>> serializer.is_valid() False # check the errors >>> serializer.errors {'date_time': [ErrorDetail(string='Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z].', code='invalid')], 'duration': [ErrorDetail(strin g='Duration has wrong format. Use one of these formats instead: [DD] [HH:[MM:]]ss[.uuuuuu].', code='invalid')]}
Aquí está el resultado de estos comandos que muestra claramente la fecha_hora y la duración como no válidos:
Conceptos avanzados
Las validaciones son parte de la deserialización y no de la serialización. Como se explicó anteriormente, la serialización es un proceso de conversión de datos ya creados en otro tipo de datos, por lo que no se requieren estas validaciones predeterminadas. La deserialización requiere validaciones ya que los datos deben guardarse en la base de datos o cualquier otra operación según lo especificado. Entonces, si serializa datos usando estos campos, eso funcionaría.
Argumentos centrales en los campos del serializador
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