pydantic.error_wrappers.ValidationError: FastAPI



我在fastapi中创建了一个crud,我有一个用户模型,我创建了另一个名为showuser的crud,只显示查询中的一些特定字段,但是当我执行请求时,我得到了一个错误。

我只想让我的请求显示我在showuser中的字段。

我的模式
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
# Create a User model
# Create a class for the user

class User(BaseModel):
username: str
password: str
name: str
lastname: str
address: Optional[str] = None
telephone: Optional[int] = None
email: str
creation_user: datetime = datetime.now()
# Create UserId model
# Create a class for the UserId
class UserId(BaseModel):
id: int
# Create a ShowUser model
# Create a class for the ShowUser
class ShowUser(BaseModel):
username: str
name: str
lastname: str
email: str
class Config():
orm_mode = True

这是我实现api

的user代码
@router.get('/{user_id}', response_model=ShowUser)
def get_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(models.User).filter(models.User.id == user_id).first()
if not user:
return {"Error": "User not found"}
return {"User": user}

终端信息

pydantic.error_wrappers.ValidationError: 4 validation errors for ShowUser 
response -> username
field required (type-value_error.missing)
response -> name
field required (type=value_error.missing) 
response -> lastname
field required (type=value_error.missing) 
response -> email
field required (type=value_error.missing)

我认为您的get_user函数的返回值是问题。与其返回{"User": user},不如尝试只返回user对象,如下所示:

@router.get('/{user_id}', response_model=ShowUser)
def get_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(models.User).filter(models.User.id == user_id).first()
if not user:
return {"Error": "User not found"}
return user

编辑:如果数据库中不包含与user_id值匹配的User对象,将发生相同的错误。处理这种常见情况的最佳方法不是返回{"Error": "User not found"},而是引发一个带有404状态码和错误消息的HTTPException:

@router.get('/{user_id}', response_model=ShowUser)
def get_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(models.User).filter(models.User.id == user_id).first()
if not user:
raise HTTPException(
status_code=int(HTTPStatus.NOT_FOUND),
detail=f"No user exists with user.id = {user_id}"
)
return user