pydantic模型如何在不实例化pydantic类的情况下工作



有人能告诉我,在没有实例化UserIn和UserOut类对象的情况下,下面的pydantic模型代码是如何工作的吗?这是由pydantic库内部处理的吗?

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()

class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None

class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None

class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
full_name: Optional[str] = None

def fake_password_hasher(raw_password: str):
return "supersecret" + raw_password

def fake_save_user(user_in: UserIn):
hashed_password = fake_password_hasher(user_in.password)
user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
print("User saved! ..not really")
return user_in_db

@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):
user_saved = fake_save_user(user_in)
print(user_saved.__dict__)
return user_saved

您不需要在代码中实例化对象,因为在这两种情况下,FastAPI都会为pydantic模式自动创建对象。

对于像示例中的user_in: UserIn这样的Pydantic模型的端点方法的参数,它被解释为RequestBody,如本文文档中所述。值得注意的是FastAPI文档中关于输入数据绑定如何为端点参数工作的解释:

  • 如果参数也在路径中声明,则它将用作路径参数
  • 如果参数是单数类型(如int、float、str、bool等(,则它将被解释为查询参数
  • 如果参数被声明为Pydantic模型的类型,它将被解释为请求主体

对于端点输出,当您定义response_model时,它也会对其进行转换,如文档中所述:

FastAPI将使用此response_mode来:

  • 将输出数据转换为其类型声明
  • 验证数据
  • 在OpenAPI路径操作中为响应添加一个JSON模式
  • 将由自动文档系统使用

相关内容

最新更新