Estoy tratando de construir un sistema de blog de Python FastAPI usando SQLAlchemy con SQLite y tengo problemas para usar/comprender el parámetro response_model del decorador de API. Aquí hay un modelo de SQLAlchemy:
class User(SqlAlchemyBase): __tablename__ = 'user' __table_args__ = {"keep_existing": True} user_uid: int = sa.Column(GUID, primary_key=True, default=GUID_DEFAULT_SQLITE) first_name: str = sa.Column(sa.String) last_name: str = sa.Column(sa.String) email: str = sa.Column(sa.String, index=True, unique=True) posts: List["Post"] = relationship("Post", backref="user") created: datetime = sa.Column(sa.DateTime, default=datetime.now(tz=timezone.utc), index=True) updated: datetime = sa.Column(sa.DateTime, default=datetime.now( tz=timezone.utc), onupdate=datetime.now(tz=timezone.utc), index=True)Aquí está el esquema de Pydantic para un usuario:
from datetime import datetime from pydantic import BaseModel class UserBase(BaseModel): first_name: str last_name: str email: str class UserInDB(UserBase): user_uid: int created: datetime updated: datetime class Config: orm_mode = True class User(UserInDB): passAquí hay un punto final de ULR para obtener un solo usuario que tiene el parámetro response_model incluido:
from typing import List import fastapi from starlette import status from backend.schema.user import User from backend.services import user_service router = fastapi.APIRouter() @router.get("/api/users/{user_uid}", response_model=User, status_code=status.HTTP_200_OK) async def get_one_user(user_uid: str = None) -> User: return await user_service.get_user(user_uid)Si ejecuto la llamada anterior en los documentos de OpenAPI creados por FastAPI, obtengo un error de servidor interno en los documentos de OpenAPI y estos errores en la consola que ejecuta la aplicación FastAPI:
File "/Users/dougfarrell/projects/blog/.venv/lib/python3.10/site-packages/fastapi/routing.py", line 137, in serialize_response raise ValidationError(errors, field.type_) pydantic.error_wrappers.ValidationError: 6 validation errors for User response -> first_name field required (type=value_error.missing) response -> last_name field required (type=value_error.missing) response -> email field required (type=value_error.missing) response -> user_uid field required (type=value_error.missing) response -> created field required (type=value_error.missing) response -> updated field required (type=value_error.missing) Si saco el parámetro response_model del decorador @router.get(...) obtengo los resultados de la consulta SQLAlchemy, pero no la serialización de Pydantic. No sé qué intenta decirme el seguimiento de la pila de errores. ¿Alguien puede ofrecer algunas sugerencias, consejos o recursos que puedan ayudarme a descubrir qué estoy haciendo mal?
Estoy usando Python versión 3.10.1, FastAPI versión 0.70.1 y SQLAlchemy versión 1.4.29.
¡Gracias!
Prueba esto:
from typing import List y cambie response_model=User a:
response_model=List[User]