Tipos de Datos Extra¶
Hasta ahora, has estado usando tipos de datos comunes, como:
intfloatstrbool
Pero también puedes usar tipos de datos más complejos.
Y todavía tendrás las mismas características que las vistas hasta ahora:
- Excelente soporte del editor.
- Conversión de datos de los requests entrantes.
- Conversión de datos para las responses.
- Validación de datos.
- Anotación y documentación automáticas.
Otros tipos de datos¶
Aquí hay algunos de los tipos de datos adicionales que puedes usar:
UUID:- Un "Universally Unique Identifier" estándar, común como ID en muchas bases de datos y sistemas.
- En requests y responses se representará como un
str.
datetime.datetime:- Un
datetime.datetimede Python. - En requests y responses se representará como un
stren formato ISO 8601, como:2008-09-15T15:53:00+05:00.
- Un
datetime.date:datetime.datede Python.- En requests y responses se representará como un
stren formato ISO 8601, como:2008-09-15.
datetime.time:- Un
datetime.timede Python. - En requests y responses se representará como un
stren formato ISO 8601, como:14:23:55.003.
- Un
datetime.timedelta:- Un
datetime.timedeltade Python. - En requests y responses se representará como un
floatde segundos totales. - Pydantic también permite representarlo como una "codificación de diferencia de tiempo ISO 8601", consulta la documentación para más información.
- Un
frozenset:- In requests and responses, treated the same as a
set:- En los requests, se leerá una lista, eliminando duplicados y convirtiéndola a un
set. - En las responses, el
setse convertirá a unalist. - El schema generado especificará que los valores del
setson únicos (usandouniqueItemsde JSON Schema).
- En los requests, se leerá una lista, eliminando duplicados y convirtiéndola a un
- In requests and responses, treated the same as a
bytes:bytesestándar de Python.- En requests y responses se tratará como un
str. - El schema generado especificará que es un
strcon "format"binary.
Decimal:Decimalestándar de Python.- En requests y responses, se maneja igual que un
float.
- Puedes consultar todos los tipos de datos válidos de Pydantic aquí: tipos de datos de Pydantic.
Ejemplo¶
Aquí hay un ejemplo de path operation con parámetros usando algunos de los tipos anteriores.
from datetime import datetime, time, timedelta
from typing import Annotated
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: Annotated[datetime, Body()],
end_datetime: Annotated[datetime, Body()],
process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[time | None, Body()] = None,
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
🤓 Otras versiones y variantes
Consejo
Preferible usar la versión con Annotated si es posible.
from datetime import datetime, time, timedelta
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: time | None = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
Ten en cuenta que los parámetros dentro de la función tienen su tipo de dato natural, y puedes, por ejemplo, realizar manipulaciones de fecha normales, como:
from datetime import datetime, time, timedelta
from typing import Annotated
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: Annotated[datetime, Body()],
end_datetime: Annotated[datetime, Body()],
process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[time | None, Body()] = None,
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
🤓 Otras versiones y variantes
Consejo
Preferible usar la versión con Annotated si es posible.
from datetime import datetime, time, timedelta
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: time | None = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}