You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:51:03