este es mi esquema de base de datos.
Definí mi esquema así:
de pydantic import BaseModel
class Userattribute(BaseModel): name: str value: str user_id: str id: strEste es mi modelo:
class Userattribute(Base): __tablename__ = "user_attribute" name = Column(String) value = Column(String) user_id = Column(String) id = Column(String, primary_key=True, index=True) En un crud.py defino un método get_attributes .
def get_attributes(db: Session, skip: int = 0, limit: int = 100): return db.query(models.Userattribute).offset(skip).limit(limit).all() Este es mi punto final GET :
@app.get("/attributes/", response_model=List[schemas.Userattribute]) def read_attributes(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): users = crud.get_attributes(db, skip=skip, limit=limit) print(users) return usersLa conexión a la base de datos parece funcionar, pero el problema es el tipo de datos:
pydantic.error_wrappers.ValidationError: 7 validation errors for Userattribute response -> 0 value is not a valid dict (type=type_error.dict) response -> 1 value is not a valid dict (type=type_error.dict) response -> 2 value is not a valid dict (type=type_error.dict) response -> 3 value is not a valid dict (type=type_error.dict) response -> 4 value is not a valid dict (type=type_error.dict) response -> 5 value is not a valid dict (type=type_error.dict) response -> 6 value is not a valid dict (type=type_error.dict)¿Por qué FASTApi espera un diccionario aquí? Realmente no lo entiendo, ya que ni siquiera puedo imprimir la respuesta. ¿Cómo puedo arreglar esto?
SQLAlchemy no devuelve un diccionario, que es lo que pydantic espera por defecto. Puede configurar su modelo para que también admita la carga desde parámetros orm estándar (es decir, atributos en el objeto en lugar de búsquedas en el diccionario):
class Userattribute(BaseModel): name: str value: str user_id: str id: str class Config: orm_mode = True También puede adjuntar un depurador justo antes de la llamada para return a ver qué se devuelve.
Dado que esta respuesta se ha vuelto un poco popular, también me gustaría mencionar que puede hacer que orm_mode = True el valor predeterminado para sus clases de esquema al tener una clase principal común que hereda de BaseModel :
class OurBaseModel(BaseModel): class Config: orm_mode = True class Userattribute(OurBaseModel): name: str value: str user_id: str id: str Esto es útil si desea admitir orm_mode para la mayoría de sus clases (y para aquellas en las que no lo hace, heredar del BaseModel normal).