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
相关产品推荐
相关产品推荐

