当前位置: 首页 > news >正文

FastAPI系列(23):ORM操作之编辑接口开发

 

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695 

说明

多对多,需要单独添加、更新

 

修改前

student表

image

student_course表没有ren的记录

 

全字段修改:方法一

from typing import List
from fastapi import APIRouter
from pydantic import BaseModel, field_validator
from test_orm.models import Student, Coursestudent_api = APIRouter()class StudentIn(BaseModel):name: strpwd: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):  # 使用 cls 而不是 selfassert value.isalpha(), 'name must be alpha'return value@field_validator("sno")@classmethod  # 必须在下面def sno_validate(cls, value):assert 1000 <= value < 10000, '学号要在[1000-10000)的范围内'return value@student_api.put("/{student_id}")
async def updateStudent(student_id: int, student_in: StudentIn):# 和添加类似,多对多关系要单独处理print(student_in, type(student_in))await Student.filter(id=student_id).update(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno,clas_id=student_in.clas_id)#  设置多对多的选修课edit_stu = await Student.get(id=student_id)choose_courses = await Course.filter(id__in=student_in.courses)await edit_stu.courses.clear()  # 清除之前的关系await edit_stu.courses.add(*choose_courses)  # 重新绑定数据return edit_stu

 

请求数据

image

 

响应结果

image

 

image

 

数据库结果

image

image

 

全字段修改:方法二

from typing import Listfrom fastapi import APIRouter
from pydantic import BaseModel, field_validatorfrom test_orm.models import Student, Coursestudent_api = APIRouter()@student_api.get("/{student_id}")
async def getOneStudent(student_id: int):student = await Student.get(id=student_id)return studentclass StudentIn(BaseModel):name: strpwd: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):  # 使用 cls 而不是 selfassert value.isalpha(), 'name must be alpha'return value@field_validator("sno")@classmethod  # 必须在下面def sno_validate(cls, value):assert 1000 <= value < 10000, '学号要在[1000-10000)的范围内'return value@student_api.put("/{student_id}")
async def updateStudent(student_id: int, student_in: StudentIn):# 和添加类似,多对多关系要单独处理# print(student_in, type(student_in))# await Student.filter(id=student_id).update(name=student_in.name, pwd=student_in.pwd, sno=student_in.sno,#                                            clas_id=student_in.clas_id)#  设置多对多的选修课# edit_stu = await Student.get(id=student_id)# choose_courses = await Course.filter(id__in=student_in.courses)# await edit_stu.courses.clear()  # 清除之前的关系# await edit_stu.courses.add(*choose_courses)  # 重新绑定数据# 和上面等价,且更简单data = student_in.dict()print(data, type(data))courses = data.pop("courses")  # courses的值是course这个key对应的value;data中就没有courses这个key了;print(courses, type(courses))print(data, type(data))await Student.filter(id=student_id).update(**data)# 设置多对多的选修课edit_stu = await Student.get(id=student_id)choose_courses = await Course.filter(id__in=courses)await edit_stu.courses.clear()  # 清除之前的关系await edit_stu.courses.add(*choose_courses)  # 重新添加数据return edit_stu

  

请求数据

image

 

响应结果

image

 

image

 

数据库结果

image

image

 

部分字段修改

from typing import Listfrom fastapi import APIRouter
from pydantic import BaseModel, field_validatorfrom test_orm.models import Student, Coursestudent_api = APIRouter()@student_api.get("/{student_id}")
async def getOneStudent(student_id: int):student = await Student.get(id=student_id)return studentclass StudentIn(BaseModel):name: strpwd: strsno: intclas_id: intcourses: List[int] = []@field_validator("name")def name_must_alpha(cls, value):  # 使用 cls 而不是 selfassert value.isalpha(), 'name must be alpha'return value@field_validator("sno")@classmethod  # 必须在下面def sno_validate(cls, value):assert 1000 <= value < 10000, '学号要在[1000-10000)的范围内'return value@student_api.put("/{student_id}")
async def updateStudent(student_id: int, student_in: StudentIn):# 只更新姓名和学号await Student.filter(id=student_id).update(name=student_in.name,sno=student_in.sno)# 获取更新后的学生信息返回updated_student = await Student.get(id=student_id)return updated_student

 

请求数据:只填需要修改的name和sno,其它默认不变

image

 

响应结果

image

 

数据库结构

image

image

 

下面方式会报错,StudentIn类型校验失败

image

 

http://www.jsqmd.com/news/358583/

相关文章:

  • 2026年亨得利钟表维修推荐评测与排名:名表售后网点选择指南与常见服务场景解析 - 品牌推荐
  • 2026年呼和浩特管道疏通服务评测推荐:解决管道堵塞难题的实用榜单 - 品牌推荐
  • 2026年2月小孩面霜便携装产品最新推荐,弱酸性护肤实测与外出护肤优选 - 品牌鉴赏师
  • buildroot系统配置nginx开机自启动网页访问
  • P1873 [COCI 2011/2012 #5] EKO / 砍树 关于二分答案的一些思考
  • 2026年呼和浩特管道疏通服务评测排名:专业团队如何解决管道堵塞难题 - 品牌推荐
  • 2026年合肥苹果售后维修点评测推荐:设备故障时如何选择可靠服务 - 品牌推荐
  • Eng. App. Comp. Flu. Mech. | 慕尼黑工大叶脉、马浩等:流固耦合问题开源平台DRLinSPH
  • 001.win电脑微信多开-电脑无需扫码认证支持登入多个微信(苹果手机也适用)
  • 2026年合肥苹果售后维修点推荐评测:设备故障时的专业服务选择指南 - 品牌推荐
  • 2026年长治系统门窗厂性价比排名,专业系统门窗定制服务解读 - 工业品牌热点
  • 这份榜单够用!10个AI论文网站深度测评,自考毕业论文写作必备
  • Spring整合Activiti,在瀚高数据库初始化时指定schema解决优秀的方案
  • 2026年亨得利钟表维修推荐评测榜:名表维保痛点解析与核心城市服务网点排名 - 品牌推荐
  • 2026年广东燃气锅炉选购指南,靠谱的老牌厂家怎么选 - 工业设备
  • 推荐曲块粉碎机多少钱,曲阜久鼎酿酒设备曲块粉碎机好用的品牌有哪些 - 工业品网
  • 【大模型应用开发】Claude Code 全方位入门指南:从零基础到本地化实战
  • 2026年合肥笔记本电脑售后维修点评测推荐:当电脑突发故障,如何快速找到靠谱服务 - 品牌推荐
  • 单北斗变形监测一体机在基础设施安全与地质灾害监测中的应用价值分析
  • 宏智树 AI:告别问卷设计低效痛点,新手也能做出专业学术问卷
  • 【Linux】du 命令查看文件和目录的磁盘占用
  • Java高频面试题:BIO、NIO、AIO有什么区别?
  • 科普|宏智树AI开题报告神器:小白避坑指南,告别导师反复打回
  • 从此告别拖延 9个AI论文写作软件测评:继续教育毕业论文+科研写作必备工具推荐
  • 2026年杭州苹果售后维修点评测推荐:设备故障时的可靠服务选择指南 - 品牌推荐
  • 2026年广州沛纳海手表维修推荐评测:非官方维修点选择指南与全国服务网点排名 - 品牌推荐
  • 2026年2月儿童氨基酸洗发沐浴露产品推荐,氨基酸洗护优选指南 - 品牌鉴赏师
  • 2026年2月儿童无由洗发水产品最新推荐,无香精洗护极简配方与敏感肌适配指南 - 品牌鉴赏师
  • 支付宝消费券回收哪里最划算? - 京顺回收
  • 2026年贵阳苹果售后维修点评测推荐:设备故障时的专业服务选择指南 - 品牌推荐