资讯动态

FastAPI Pydantic 模型

发布时间:2026/10/2 13:54:02 来源:尧图企业网站定制
FastAPI Pydantic 模型1. 基本模型定义frompydanticimportBaseModelfromtypingimportOptionalclassBook(BaseModel):id:inttitle:strauthor:strprice:Optional[float]Noneis_available:boolTrue使用bookBook(id1,titlePython入门,authorGuido,price59.9)print(book.dict())# {id: 1, title: Python入门, ...}print(book.json())# JSON 字符串print(book.id)# 12. 字段校验FieldfrompydanticimportBaseModel,FieldclassBookCreate(BaseModel):title:strField(...,# 必填min_length1,# 最小长度max_length100,# 最大长度description图书标题,examplePython编程从入门到实践)author:strField(...,min_length1,description作者)isbn:strField(...,regexr^\d{10}(\d{3})?$,# 正则校验descriptionISBN编号)price:floatField(...,ge0,# 大于等于 0le9999,# 小于等于 9999description价格)stock:intField(default0,# 默认值ge0,description库存数量)tags:list[str]Field(default_factorylist,# 可变默认值description标签列表)Field 数值约束约束说明gt大于 ()ge大于等于 ()lt小于 ()le小于等于 ()min_length字符串最小长度max_length字符串最大长度regex正则匹配3. 嵌套模型classAddress(BaseModel):city:strstreet:strzip_code:strclassPublisher(BaseModel):name:straddress:AddressclassBookDetail(BaseModel):title:strpublisher:Publisher请求体示例{title:Python入门,publisher:{name:人民邮电出版社,address:{city:北京,street:朝阳区建国路,zip_code:100020}}}4. 模型继承classBookBase(BaseModel):title:strField(...,min_length1)author:strisbn:strprice:floatField(...,ge0)classBookCreate(BookBase):创建时使用 — 所有字段必填passclassBookUpdate(BaseModel):更新时使用 — 所有字段可选title:Optional[str]Noneauthor:Optional[str]Noneisbn:Optional[str]Noneprice:Optional[float]Field(None,ge0)classBookResponse(BookBase):响应时使用 — 包含 idid:intclassBookDetailResponse(BookResponse):详情响应 — 包含更多字段description:Optional[str]Nonecreated_at:str5. 模型配置ConfigfrompydanticimportBaseModelclassBook(BaseModel):id:inttitle:strauthor_name:strclassConfig:# ORM 模式从 ORM 对象读取属性如 SQLAlchemyorm_modeTrue# 字段别名fields{author_name:{alias:author}}# 允许任意字段extraforbid# allow | ignore | forbid# JSON 示例schema_extra{example:{id:1,title:Python入门,author_name:Guido}}Pydantic V2 写法frompydanticimportBaseModel,ConfigDictclassBook(BaseModel):model_configConfigDict(from_attributesTrue,# 等同于 orm_modepopulate_by_nameTrue,# 允许按字段名赋值而非仅别名json_schema_extra{example:{id:1,title:Python入门,author_name:Guido}})id:inttitle:strauthor_name:strField(aliasauthor)6. 自定义校验器V1 写法validatorfrompydanticimportBaseModel,validatorclassBookCreate(BaseModel):title:strstart_date:strend_date:strvalidator(end_date)defend_date_must_after_start(cls,v,values):ifstart_dateinvaluesandvvalues[start_date]:raiseValueError(结束日期必须晚于开始日期)returnvvalidator(title)deftitle_must_not_empty(cls,v):ifnotv.strip():raiseValueError(标题不能为空白)returnv.strip()V2 写法field_validatorfrompydanticimportBaseModel,field_validatorclassBookCreate(BaseModel):title:strstart_date:strend_date:strfield_validator(end_date)classmethoddefend_date_must_after_start(cls,v,info):ifinfo.data.get(start_date)andvinfo.data[start_date]:raiseValueError(结束日期必须晚于开始日期)returnvfield_validator(title)classmethoddeftitle_must_not_empty(cls,v):ifnotv.strip():raiseValueError(标题不能为空白)returnv.strip()模型级校验器frompydanticimportBaseModel,root_validator# V1# from pydantic import model_validator # V2classBookCreate(BaseModel):password:strconfirm_password:strroot_validatordefpasswords_match(cls,values):ifvalues.get(password)!values.get(confirm_password):raiseValueError(两次密码不一致)returnvalues7. 常用类型frompydanticimportBaseModel,EmailStr,HttpUrl,conint,constrfromtypingimportOptional,List,Dictfromdatetimeimportdatetime,datefromuuidimportUUIDfromdecimalimportDecimalclassExampleModel(BaseModel):# 基本类型name:strage:intscore:floatis_active:bool# 约束类型quantity:conint(ge0,le100)# 约束整数code:constr(min_length6,max_length6)# 约束字符串# 可选类型nickname:Optional[str]None# 集合类型tags:List[str][]metadata:Dict[str,str]{}# 日期时间created_at:datetime birth_date:date# 特殊类型email:EmailStr# 邮箱校验website:HttpUrl# URL 校验uid:UUID# UUID 格式price:Decimal# 高精度小数8. 模型方法classBookCreate(BaseModel):title:strauthor:strprice:floatbookBookCreate(titlePython,authorGuido,price59.9)# 导出book.dict()# {title: Python, author: Guido, price: 59.9}book.dict(exclude_unsetTrue)# 只导出显式设置的字段book.dict(exclude{price})# 排除指定字段book.dict(include{title})# 只包含指定字段book.json()# JSON 字符串# 从 ORM 对象创建需 orm_modeTrueBookCreate.from_orm(orm_object)# 拷贝与更新book.copy(update{price:69.9})# 解析字典BookCreate.parse_obj({title:Python,author:Guido,price:59.9})# 解析 JSONBookCreate.parse_raw({title: Python, author: Guido, price: 59.9})9. 在 FastAPI 中使用fromfastapiimportFastAPIfrompydanticimportBaseModel,Field appFastAPI()classBookCreate(BaseModel):title:strField(...,min_length1,max_length100)author:strprice:floatField(...,ge0)classBookResponse(BaseModel):id:inttitle:strauthor:strprice:floatclassConfig:orm_modeTrueapp.post(/books/,response_modelBookResponse,status_code201)defcreate_book(book:BookCreate):# book 已通过 Pydantic 校验saved{id:1,**book.dict()}returnsavedapp.get(/books/{book_id},response_modelBookResponse)defget_book(book_id:int):# 模拟从数据库获取 ORM 对象# response_model orm_mode 自动转换returnbook_orm_object总结Pydantic 是 FastAPI 的核心依赖负责数据校验与序列化。掌握BaseModel定义、Field约束、模型继承、自定义校验器和Config配置即可构建健壮的 API 数据层。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑