FastAPI - GET 请求导致类型错误(值不是有效的字典)
FastAPI - GET request results in typeerror (value is not a valid dict)
这是我的数据库架构。
我这样定义我的模式:
从 pydantic 导入 BaseModel
class Userattribute(BaseModel):
name: str
value: str
user_id: str
id: str
这是我的模型:
class Userattribute(Base):
__tablename__ = "user_attribute"
name = Column(String)
value = Column(String)
user_id = Column(String)
id = Column(String, primary_key=True, index=True)
在crud.py中我定义了一个get_attributes
方法。
def get_attributes(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Userattribute).offset(skip).limit(limit).all()
这是我的 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 users
与数据库的连接似乎正常,但数据类型有问题:
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)
为什么 FASTApi 在这里需要字典?我真的不明白,因为我什至无法打印回复。我该如何解决这个问题?
SQLAlchemy 没有 return 字典,这是 pydantic 默认情况下所期望的。您可以将模型配置为还支持从标准 orm 参数加载(即对象上的属性而不是字典查找):
class Userattribute(BaseModel):
name: str
value: str
user_id: str
id: str
class Config:
orm_mode = True
您还可以在调用 return
之前附加调试器,以查看正在 return 编辑的内容。
由于这个答案变得有点流行,我还想提一下,您可以通过拥有一个共同的父 class 将 orm_mode = True
设置为架构 class 的默认值继承自 BaseModel
:
class OurBaseModel(BaseModel):
class Config:
orm_mode = True
class Userattribute(OurBaseModel):
name: str
value: str
user_id: str
id: str
如果您想为大多数 class 支持 orm_mode
(对于那些您不支持的,请继承常规 BaseModel
),这将很有用。
这是我的数据库架构。
我这样定义我的模式:
从 pydantic 导入 BaseModel
class Userattribute(BaseModel):
name: str
value: str
user_id: str
id: str
这是我的模型:
class Userattribute(Base):
__tablename__ = "user_attribute"
name = Column(String)
value = Column(String)
user_id = Column(String)
id = Column(String, primary_key=True, index=True)
在crud.py中我定义了一个get_attributes
方法。
def get_attributes(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Userattribute).offset(skip).limit(limit).all()
这是我的 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 users
与数据库的连接似乎正常,但数据类型有问题:
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)
为什么 FASTApi 在这里需要字典?我真的不明白,因为我什至无法打印回复。我该如何解决这个问题?
SQLAlchemy 没有 return 字典,这是 pydantic 默认情况下所期望的。您可以将模型配置为还支持从标准 orm 参数加载(即对象上的属性而不是字典查找):
class Userattribute(BaseModel):
name: str
value: str
user_id: str
id: str
class Config:
orm_mode = True
您还可以在调用 return
之前附加调试器,以查看正在 return 编辑的内容。
由于这个答案变得有点流行,我还想提一下,您可以通过拥有一个共同的父 class 将 orm_mode = True
设置为架构 class 的默认值继承自 BaseModel
:
class OurBaseModel(BaseModel):
class Config:
orm_mode = True
class Userattribute(OurBaseModel):
name: str
value: str
user_id: str
id: str
如果您想为大多数 class 支持 orm_mode
(对于那些您不支持的,请继承常规 BaseModel
),这将很有用。