
























本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695
多对多,需要单独添加、更新
student表

student_course表没有ren的记录
from typing import List
from fastapi import APIRouter
from pydantic import BaseModel, field_validator
from test_orm.models import Student, Course
student_api = APIRouter()
class StudentIn(BaseModel):
name: str
pwd: str
sno: int
clas_id: int
courses: List[int] = []
@field_validator("name")
def name_must_alpha(cls, value): # 使用 cls 而不是 self
assert 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
请求数据

响应结果


数据库结果


from typing import List
from fastapi import APIRouter
from pydantic import BaseModel, field_validator
from test_orm.models import Student, Course
student_api = APIRouter()
@student_api.get("/{student_id}")
async def getOneStudent(student_id: int):
student = await Student.get(id=student_id)
return student
class StudentIn(BaseModel):
name: str
pwd: str
sno: int
clas_id: int
courses: List[int] = []
@field_validator("name")
def name_must_alpha(cls, value): # 使用 cls 而不是 self
assert 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
请求数据

响应结果


数据库结果


from typing import List
from fastapi import APIRouter
from pydantic import BaseModel, field_validator
from test_orm.models import Student, Course
student_api = APIRouter()
@student_api.get("/{student_id}")
async def getOneStudent(student_id: int):
student = await Student.get(id=student_id)
return student
class StudentIn(BaseModel):
name: str
pwd: str
sno: int
clas_id: int
courses: List[int] = []
@field_validator("name")
def name_must_alpha(cls, value): # 使用 cls 而不是 self
assert 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,其它默认不变

响应结果

数据库结构


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

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。