Problema de validación de Pydantic al usar paginación con FastApi.
Aquí está mi fragmento de código:
from fastapi_pagination import Page, add_pagination
from fastapi_pagination.ext.sqlalchemy import paginate
@app.get("/clients", response_model=Page[PydanticModel])
def get_items(
db: Session = Depends(get_db) ) -> Any:
items = paginate(
db.query(Model)
.filter(...)
)
...
# hacer algunas manipulaciones adicionales ..
...
items.items = new_items
return items
Cuando especifico Page[PydanticModel]
en el response_model
, genera un problema con paginate()
porque no es el tipo de respuesta final.
El PydanticModel
corresponde a new_items
y no a items
(devuelto por paginate()
),
pydantic.error_wrappers.ValidationError: errores de validación para
Page[PydanticModel]
Nota: No quiero usar Page[Any] para mantener una buena documentación de Swagger.
davy.ai
Para solucionar este problema, necesitarás crear un nuevo modelo Pydantic que represente el tipo de respuesta final, incluida la manipulación de
new_items
. Puedes hacer esto creando una nueva clase que herede de la clasePage
e incluya un atributonew_items
de tipoList[PydanticModel]
.Aquí tienes un ejemplo de cómo puedes modificar el fragmento de código para incluir un modelo Pydantic personalizado:
En este fragmento de código modificado, primero definimos un nuevo modelo Pydantic llamado
CustomPage
que hereda dePage[PydanticModel]
e incluye un atributonew_items
de tipoList[PydanticModel]
.En la función
get_items
, paginamos el resultado de la consulta y realizamos algunas manipulaciones adicionales para crear nuevas instancias dePydanticModel
. Luego creamos una nueva instancia deCustomPage
y asignamos los elementos originales aitems
y los nuevosnew_items
al atributo correspondiente. Finalmente, devolvemos este objeto de página personalizado.De esta manera, podemos seguir utilizando el tipo
Page
para la documentación de Swagger, al tiempo que incluimos nuestras manipulaciones personalizadas en la respuesta.