title: Pydantic Schema生成指南:自定义JSON Schema

date: 2025/3/27

updated: 2025/3/27

author: cmdragon

excerpt:

Pydantic的Schema生成机制支持从基础定义到企业级应用的完整解决方案。默认流程包含字段定义、元数据收集、类型映射和Schema组装四个步骤。通过Field的json_schema_extra可注入字段级扩展元数据,继承GenerateJsonSchema实现类型映射重载。动态生成支持运行时模型构建和环境感知调整,企业级方案涵盖OpenAPI增强和版本化管理。性能优化推荐LRU缓存,错误处理需注意格式兼容性和必填字段验证。最佳实践包括契约优先、版本控制和自动化测试。

categories:

  • 后端开发
  • FastAPI

tags:

  • Pydantic Schema生成
  • JSON Schema定制
  • OpenAPI规范增强
  • 动态Schema构建
  • 字段元数据管理
  • 企业级数据契约
  • Schema版本控制

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

探索数千个预构建的 AI 应用,开启你的下一个伟大创意


第一章:Schema生成基础

1.1 默认Schema生成机制

from pydantic import BaseModel

class User(BaseModel):
id: int
name: str = Field(..., max_length=50) print(User.schema_json(indent=2))

输出特征

{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"type": "string",
"maxLength": 50
}
},
"required": [
"id",
"name"
]
}

1.2 Schema生成流程

graph TD
A[字段定义] --> B[元数据收集]
B --> C[类型映射]
C --> D[约束转换]
D --> E[Schema组装]

第二章:核心定制技术

2.1 字段级元数据注入

from pydantic import BaseModel, Field

class Product(BaseModel):
sku: str = Field(
...,
json_schema_extra={
"x-frontend": {"widget": "search-input"},
"x-docs": {"example": "ABC-123"}
}
) print(Product.schema()["properties"]["sku"])

输出

{
"title": "Sku",
"type": "string",
"x-frontend": {
"widget": "search-input"
},
"x-docs": {
"example": "ABC-123"
}
}

2.2 类型映射重载

from pydantic import BaseModel
from pydantic.json_schema import GenerateJsonSchema class CustomSchemaGenerator(GenerateJsonSchema):
def generate(self, schema):
if schema["type"] == "string":
schema["format"] = "custom-string"
return schema class DataModel(BaseModel):
content: str print(DataModel.schema(schema_generator=CustomSchemaGenerator))

第三章:动态Schema生成

3.1 运行时Schema构建

from pydantic import create_model
from pydantic.fields import FieldInfo def dynamic_model(field_defs: dict):
fields = {}
for name, config in field_defs.items():
fields[name] = (
config["type"],
FieldInfo(**config["field_params"])
)
return create_model('DynamicModel', **fields) model = dynamic_model({
"timestamp": {
"type": int,
"field_params": {"ge": 0, "json_schema_extra": {"unit": "ms"}}
}
})

3.2 环境感知Schema

from pydantic import BaseModel, ConfigDict

class EnvAwareSchema(BaseModel):
model_config = ConfigDict(json_schema_mode="dynamic") @classmethod
def __get_pydantic_json_schema__(cls, core_schema, handler):
schema = handler(core_schema)
if os.getenv("ENV") == "prod":
schema["required"].append("audit_info")
return schema

第四章:企业级应用模式

4.1 OpenAPI增强方案

from pydantic import BaseModel

class OpenAPICompatible(BaseModel):
model_config = dict(
json_schema_extra={
"components": {
"schemas": {
"ErrorResponse": {
"type": "object",
"properties": {
"code": {"type": "integer"},
"message": {"type": "string"}
}
}
}
}
}
)

4.2 版本化Schema管理

from pydantic import BaseModel, field_validator

class VersionedModel(BaseModel):
model_config = ConfigDict(extra="allow") @classmethod
def __get_pydantic_json_schema__(cls, core_schema, handler):
schema = handler(core_schema)
schema["x-api-version"] = "2.3"
return schema class V1Model(VersionedModel):
@classmethod
def __get_pydantic_json_schema__(cls, *args):
schema = super().__get_pydantic_json_schema__(*args)
schema["x-api-version"] = "1.2"
return schema

第五章:错误处理与优化

5.1 Schema验证错误

try:
class InvalidSchemaModel(BaseModel):
data: dict = Field(format="invalid-format")
except ValueError as e:
print(f"Schema配置错误: {e}")

5.2 性能优化策略

from functools import lru_cache

class CachedSchemaModel(BaseModel):
@classmethod
@lru_cache(maxsize=128)
def schema(cls, **kwargs):
return super().schema(**kwargs)

课后Quiz

Q1:如何添加自定义Schema属性?

A) 使用json_schema_extra

B) 修改全局配置

C) 继承GenerateJsonSchema

Q2:处理版本兼容的正确方式?

  1. 动态注入版本号
  2. 创建子类覆盖Schema
  3. 维护多个模型

Q3:优化Schema生成性能应使用?

  • LRU缓存
  • 增加校验步骤
  • 禁用所有缓存

错误解决方案速查表

错误信息 原因分析 解决方案
ValueError: 无效的format类型 不支持的Schema格式 检查字段类型与格式的兼容性
KeyError: 缺失必需字段 动态Schema未正确注入 验证__get_pydantic_json_schema__实现
SchemaGenerationError 自定义生成器逻辑错误 检查类型映射逻辑
MemoryError 大规模模型未缓存 启用模型Schema缓存

架构箴言:Schema设计应遵循"契约优先"原则,建议使用Git版本控制管理Schema变更,通过CI/CD流水线实现Schema的自动化测试与文档生成,建立Schema变更通知机制保障多团队协作。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:Pydantic Schema生成指南:自定义JSON Schema | cmdragon's Blog

往期文章归档:

Pydantic Schema生成指南:自定义JSON Schema的更多相关文章

  1. 使用JSON Schema来验证接口数据

    最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...

  2. 技术那么多,你想看看JSON Schema的测试吗?

    目录 1. 什么是JSON Schema? 2. 如何定义一个JSON Schema 3. 如何测试JSON Schema a) 使用JSON Schema validator GUI b) 在Jav ...

  3. Json.Net使用JSON Schema验证JSON格式

    Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...

  4. JSON Schema 校验实例

    JSON Schema 简介 JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. ...

  5. Understanding JSON Schema

    json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...

  6. Map传参优雅检验,试试json schema validator

    背景 笔者目前所在团队的代码年代已久,早年规范缺失导致现在维护成本激增,举一个深恶痛疾的例子就是方法参数使用Map"一撸到底",说多了都是泪,我常常在团队内自嘲"咱硬是把 ...

  7. rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)

    rest-assured从2.1.0版本开始支持  Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...

  8. Json Schema简介

    1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...

  9. graphql-compose graphql schema 生成工具集

    graphql-compose 是一个强大的graphql schema 生成工具集 包含以下特性 快速便捷的复杂类型生成 类型仓库,类型可以存储在schemacomposer 存储中 包含flowt ...

  10. 3 分钟了解 JSON Schema

    大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...

随机推荐

  1. 修改led-core.c 让led的delay_on和delay_off时间不会应为trigger配置改版而重置为1HZ

    先列一下leds trigger的设置流程 echo none > trigger 的流程 led_trigger_set() | led_stop_software_blink() echo ...

  2. ABAP配置:OY01 定义国家/地区

    配置:OY01 定义国家/地区 事务代码:OY01 配置路径: SPRO-ABAP平台-常规设置-设置国家-定义国家/地区 配置路径截图: 配置描述: 国家是SAP里面一个非常重要的概念,SAP国家概 ...

  3. CDS标准视图:催款代码描述 I_DunningKeyText

    视图名称:催款代码描述 I_DunningKeyText 视图类型: 视图代码: 点击查看代码 @EndUserText.label: 'Dunning Key - Text' @Analytics. ...

  4. nginx.conf参数优化详解

    1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...

  5. 转换流:InputStreamReader、OutputStreamWriter

    1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWriter:将一 ...

  6. Map 实现类之:TreeMap(SortedMap的实现类) 和 Properties(Hashtable的实现类)

    TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序.TreeMap 可以保证所有的 Key-Value 对处于 有序状态.TreeSet底层使用 红黑树结构存储 ...

  7. 3090 cuda环境配置杂记

    实验室新配了3090的电脑,cuda环境配置上出了些问题,百度很久才找到解决方法,因此记录下来. 主要参考:(6条消息) 服务器Linux环境配置cuda(非管理员)_@@Lynn的博客-CSDN博客 ...

  8. Win7远程桌面连接不上

    Windows远程桌面连接不上有多种情况,当完成基本设置后,如果连不上,那么最可能的情况是防火墙和网络设置不匹配. 1. 检查一下Window防火墙中远程桌面的设置,默认情况下只允许"家庭/ ...

  9. ESP32 VScode环境问题

    vsdcode esp-idf插件安装 报错: Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERR ...

  10. angularjs和ajax的结合使用 (四)

    知道的朋友了解 我不是属于讲按部就班技术的那种人.什么xx入门 ,入门到精通,入门到入土. 其实非要严格说的话已经跟angularjs 什么ajax 偏的有点远了,之所以还是叫这个名称,因为都属于we ...