Saltar al contenido

Tipos de Datos Extra

Hasta ahora, has estado usando tipos de datos comunes, como:

  • int
  • float
  • str
  • bool

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.datetime de Python.
    • En requests y responses se representará como un str en formato ISO 8601, como: 2008-09-15T15:53:00+05:00.
  • datetime.date:
    • datetime.date de Python.
    • En requests y responses se representará como un str en formato ISO 8601, como: 2008-09-15.
  • datetime.time:
    • Un datetime.time de Python.
    • En requests y responses se representará como un str en formato ISO 8601, como: 14:23:55.003.
  • datetime.timedelta:
    • Un datetime.timedelta de Python.
    • En requests y responses se representará como un float de 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.
  • 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 set se convertirá a una list.
      • El schema generado especificará que los valores del set son únicos (usando uniqueItems de JSON Schema).
  • bytes:
    • bytes estándar de Python.
    • En requests y responses se tratará como un str.
    • El schema generado especificará que es un str con "format" binary.
  • Decimal:
    • Decimal está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,
    }