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

FastAPI如何实现每次接口请求时触发Pydantic模型绑定的生成函数

问题根源

你遇到的问题是Pydantic模型的默认值计算逻辑导致的:直接在类属性定义时执行generate_id()、ts()作为默认值,这两个函数只会在类定义被加载时(也就是服务启动时)执行一次,后续所有模型实例化都会复用第一次生成的固定值,不会重新计算。

解决方案

使用Pydantic Field的default_factory参数指定默认值生成函数即可,default_factory会在每次实例化模型时自动调用传入的可调用对象,生成新的默认值:

  • 注意传入default_factory的是函数本身,不要加括号,避免提前执行

修改后的Schema代码

from pydantic import BaseModel, Field
import datetime
import random
import string
from typing import Optional

def ts():
    d = datetime.datetime.now()
    return datetime.datetime.timestamp(d)*1000


def generate_id():
    first = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(8))
    second = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(4))
    third = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(4))
    fourth = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(4))
    fifth = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(12))

    _id = f'{first}-{second}-{third}-{fourth}-{fifth}'
    return _id

class User(BaseModel):
    # 用default_factory指定生成函数,不要加括号
    id: str = Field(default_factory=generate_id)
    username: str
    email: str # 补充接口逻辑里用到的email字段,原代码漏了该定义
    created_timestamp: Optional[str] = Field(default_factory=ts)

其他CRUD和接口代码不需要做任何修改,修改后每次发起POST请求创建用户时,都会自动生成新的ID和时间戳。

内容的提问来源于stack exchange,提问作者Data Mastery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:08