尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FastAPI 新手入门第 10 篇:接口、模型、表不是一回事
下一篇我们准备接数据库。在动数据库代码前我想先把一个容易混的点讲清楚请求模型、响应模型、数据库里的数据不应该总是用同一个类。这篇先不写 SQL。我们继续用内存数据模拟但把三个模型分开ItemCreate用来接收创建请求ItemPublic用来返回给前端ItemInDB用来表示服务内部保存的数据。做完后我们会创建一个商品。请求里不传id、cost_price、created_at但服务端会自己补上响应里也不会把cost_price暴露出去。一个模型到处用会很快别扭前面我们已经有两个模型classItemCreate(BaseModel):name:strprice:floatis_offer:boolFalseclassItemPublic(BaseModel):id:intname:strprice:floatis_offer:boolFalse这两个模型的分工已经不同ItemCreate前端创建商品时能传什么。ItemPublic接口返回给前端什么。现在如果准备保存数据还会多出一些字段。比如成本价cost_price、创建时间created_at。这些字段服务端需要但前端创建商品时不应该传接口返回时也不一定要给。所以我会再加一个内部模型。抽出 ItemBase减少重复字段name、price、is_offer在几个模型里都会出现。可以先抽一个基础模型fromdatetimeimportdatetimefrompydanticimportBaseModelclassItemBase(BaseModel):name:strprice:floatis_offer:boolFalseclassItemCreate(ItemBase):passclassItemPublic(ItemBase):id:intclassItemInDB(ItemBase):id:intcost_price:floatcreated_at:datetime这里的重点不是继承语法而是边界ItemCreate没有id因为创建时 ID 应该由服务端生成。ItemPublic没有cost_price因为成本价不该从接口暴露出去。ItemInDB有完整字段因为服务端内部需要保存它们。这三个模型名字很直白读代码时不用猜它们分别在哪个地方用。用 ItemInDB 模拟服务端内部数据现在把内存数据从普通字典换成ItemInDBfromdatetimeimportdatetime,timezone fake_items_db{1:ItemInDB(id1,nameHammer,price9.99,is_offerFalse,cost_price4.0,created_atdatetime(2026,1,1,tzinfotimezone.utc),),}这段代码模拟的是“数据库里真实保存的数据”。它比接口返回给前端的数据多。后面换成 SQLModel 或 SQLAlchemy 时这个位置会变成数据库模型或 ORM 对象。现在先用ItemInDB把边界练清楚。创建接口只接收 ItemCreate创建商品时请求体仍然用ItemCreaterouter.post(,response_modelItemPublic,summary创建商品,)defcreate_item(item:ItemCreate,token:strDepends(get_token_header)):new_itemItemInDB(idmax(fake_items_db)1,**item.model_dump(),cost_priceitem.price*0.6,created_atdatetime.now(timezone.utc),)fake_items_db[new_item.id]new_itemreturnnew_item重点看函数签名和装饰器defcreate_item(item:ItemCreate,...)这表示请求体只允许传name、price、is_offer。response_modelItemPublic这表示响应只返回id、name、price、is_offer。函数里面虽然创建了ItemInDB里面有cost_price和created_at但返回给前端时会被ItemPublic过滤掉。在 /docs 里试一次启动服务.\.venv\Scripts\Activate.ps1 python-m pip install-e.$env:PYTHONIOENCODING utf-8$env:PYTHONUTF8 1fastapi dev app/main.py打开http://127.0.0.1:8000/docs调用POST /items请求头里填x-token: secret-token请求体填{name:Notebook,price:12.5,is_offer:true}响应应该类似这样{name:Notebook,price:12.5,is_offer:true,id:4}注意响应里没有cost_price也没有created_at。这不是因为函数里没创建它们而是因为response_modelItemPublic只允许这些字段出现在响应里。分清三个问题写接口时我会把这三个问题分开想前端创建时能传什么用ItemCreate回答。前端读取时能看到什么用ItemPublic回答。服务端内部需要保存什么用ItemInDB回答。如果用一个模型回答三个问题前期代码会少几行后面会开始互相牵扯想给数据库加字段结果请求体也多了字段想隐藏内部字段响应又要额外处理。分开以后每个变化只影响它该影响的地方。动手改一下给ItemInDB增加一个created_by字段classItemInDB(ItemBase):id:intcost_price:floatcreated_at:datetime created_by:str创建商品时由服务端补上new_itemItemInDB(idmax(fake_items_db)1,**item.model_dump(),cost_priceitem.price*0.6,created_atdatetime.now(timezone.utc),created_bysystem,)然后在/docs里调用POST /items。请求体里不用传created_by响应里也不应该出现created_by。如果这两点都成立说明你已经把请求模型、响应模型和内部模型分开了。到这里这篇的目标已经完成我们把ItemCreate、ItemPublic、ItemInDB分成了三个用途。我们创建商品时只接收业务输入字段。我们确认内部字段不会被接口响应暴露出去。本文代码https://github.com/tanghaojin/fastapi-beginner-lab/tree/article-10-model-boundary下一篇开始接数据库把现在的内存数据换成 SQLite让数据在服务重启后还能查到。参考资料FastAPI Response Model: https://fastapi.tiangolo.com/tutorial/response-model/FastAPI SQL Databases: https://fastapi.tiangolo.com/tutorial/sql-databases/
RELATED

相关推荐

庭院驱蚊药剂轮换使用的基本原理

庭院驱蚊药剂轮换使用的基本原理

有研究表明,长期单一使用同一种驱蚊药剂,致蚊虫抗药性出现的平均时间约为两到三个繁殖周期,这给庭院驱蚊管理带来了持续挑战。一、蚊虫抗药性的形成机制 蚊虫对驱蚊药剂产生抗药性,本质上是一种生物进化现象。当同一种药剂被反复使…

📅 2026/8/30 9:51:48
直播录制画质排查手册:分辨率、码率、网络、转码一次讲清

直播录制画质排查手册:分辨率、码率、网络、转码一次讲清

做直播切片、AI剪辑、录播带货、直播复盘时,很多人都会遇到一个问题:直播间在线看着还挺清楚,但录下来之后,视频却明显发糊。 常见表现包括:主播脸部不清晰、商品细节看不清、字幕边缘发虚、人物移动时有拖影、视频导…

📅 2026/8/30 10:00:04
基于Cortex构建自动化文件分析框架:以IndexTTS 2.0漏洞检测为例

基于Cortex构建自动化文件分析框架:以IndexTTS 2.0漏洞检测为例

1. 项目概述:为什么我们需要自动化分析可疑文件?最近在安全分析工作中,我遇到了一个挺有意思的挑战。团队里负责威胁情报的同事丢过来一批可疑文件,说怀疑是针对某个特定开源项目——IndexTTS 2.0的漏洞利用样本。IndexTTS 2.0是一…

📅 2026/9/4 15:52:19
MORE NEWS

更多资讯

📰

HoneClaw 架构深度解析:Rust + SolidJS 开源 AI 投研助手是如何搭起来的

【免费下载链接】honeclaw HoneClaw (Hone-Financial) is dedicated to being a professional investment assistant that truly understands you. 项目地址: https://gitcode.com/gh_mirrors/ho/honeclaw 点击查看 免费下载 HoneClaw(Hone-Financial&a…

📰

LatticeDB事务与持久化深度解析:ACID保证、快照隔离与单写者模型

【免费下载链接】latticedb Embedded single-file knowledge graph database with vector search and full-text search for AI/RAG apps 项目地址: https://gitcode.com/gh_mirrors/la/latticedb 点击查看 免费下载 LatticeDB 是一款嵌入式的单文件知识图谱数据库…

📰

Tree-sitter 入门:3 分钟跑通你的第一个增量解析器

Tree-sitter 入门:3 分钟跑通你的第一个增量解析器 【免费下载链接】tree-sitter An incremental parsing system for programming tools 项目地址: https://gitcode.com/gh_mirrors/tr/tree-sitter 做 Tree-sitter 入门之前,先聊一个你肯定遇过的…

📰

guizang-ppt-skill 杂志风主题色预设指南:5 套色板的选择、:root 六行替换与防翻车规则

guizang-ppt-skill 杂志风主题色预设指南:5 套色板的选择、:root 六行替换与防翻车规则 【免费下载链接】guizang-ppt-skill AI-agent Skill for generating polished HTML slide decks: editorial magazine and Swiss layouts, image prompts, social covers, and …

📰

PM-Skills会议技能全家桶:4大AI技能如何覆盖从议程到跨会议综合的全场景

【免费下载链接】pm-skills 68 plug-and-play, best-practice product management skills for AI agents: 30 Triple Diamond phase 11 foundation 12 utility 15 tool (Foundation Sprint Design Sprint). Plus 6 sub-agents, workflows, 200 output samples, guides, and…

📰

Z2400032基于Java+Mysql+SSM的校园在线点餐系统的设计与实现 代码 论文

在线点餐系统1.项目描述2. 技术栈3. 项目结构后端前端4. 功能模块5. 项目实现步骤注意事项6.界面展示7.源码获取1.项目描述 本项目旨在开发一个校园在线点餐系统,通过前后端分离的方式,为在校学生提供便捷的餐厅点餐服务,同时方便餐厅和食堂…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬