FastAPI(Pydantic)中如何扁平化/重映射模型,让多对多字段仅输出ID
解决方法
你只需要修改schemas.py中的Pydantic序列化规则即可,无需改动ORM模型和查询逻辑,这种方式不会影响其他接口对关联字段的使用。
第一步:调整UserBase的字段类型与序列化逻辑
修改schemas.py代码如下:
# Pydantic V2 版本写法 from pydantic import BaseModel, field_validator from typing import List class ArticleBase(BaseModel): id: int title: str class UserBase(BaseModel): id: int username: str # 直接将articles字段类型声明为int数组 articles: List[int] # 序列化前提前提取所有关联文章的id @field_validator("articles", mode="before") def extract_article_id(cls, value): return [item.id for item in value]
如果你使用的是Pydantic V1版本,将字段验证器部分替换为以下代码即可:
# Pydantic V1 版本写法 from pydantic import validator class UserBase(BaseModel): id: int username: str articles: List[int] @validator("articles", pre=True) def extract_article_id(cls, value): return [item.id for item in value]
第二步:可选性能优化(避免N+1查询)
如果你想优化查询性能,避免序列化时触发多次额外查询拉取文章数据,可以修改crud.py的get_users方法,提前加载关联的articles:
from sqlalchemy.orm import joinedload def get_users(db: Session): return db.query(models.User).options(joinedload(models.User.articles)).all()
修改完成后重启服务,调用/users/接口就会直接返回你预期的文章id数组格式。
内容的提问来源于stack exchange,提问作者xzzxy
相关产品推荐
相关产品推荐

