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. milvus基础

    nlist和nprobe nlist 是调用 create_index 时设置的参数,nprobe 则是调用 search 时设置的参数. IVFLAT 和 SQ8 索引都是通过聚类算法把大量的向量划 ...

  2. vs2017 iisexpress 绑定自定义域名

    1.项目根目录找到 项目/.vs/config/applicationhost.config 2.添加绑定域名 <site name="demo" id="2&qu ...

  3. session实现登录以及session与Cookie的关系

    基于session实现登录 发送短信验证码: public Result sendCode(String phone, HttpSession session) { // 1.校验手机号 if (Re ...

  4. 新版 Cursor 把其他 AI 编程工具按在地上摩擦了!

    大家好,我是汤师爷~ AI编程助手Cursor背后的Anysphere公司刚刚完成了1亿美元的B轮融资,估值直接飙升至26亿美元. 四个月前,这家公司刚拿下6000万美元,估值还只有4亿美元.如今,增 ...

  5. Redis学习笔记之Jedis

    Jedis语法总结 Jedis是Java代码操作Redis的工具包,里面封装了操作Redis的方法 Jedis jedis = new Jedis(String ip , String port) 1 ...

  6. 单点认证(SSO)方案调研总结

    SSO方案 SSO介绍 单点登录(SSO)是一种身份验证解决方案,可让用户通过一次性用户身份验证登录多个应用程序和网站.这意味着用户只需输入一次用户名和密码,即可访问所有相互信任的系统,而无需在每个系 ...

  7. linux-大数据常用命令

    1. vi/vim一般模式语法 功能描述yy 复制光标当前一行y数字y 复制一段(从第几行到第几行)p 箭头移动到目的行粘贴u 撤销上一步dd 删除光标当前行d数字d 删除光标(含)后多少行x 删除一 ...

  8. springBoot(1)--初步理解

    在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2)配置数据库连接.配置sprin ...

  9. 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增

    Lock( 锁) 从JDK 5.0开始,Java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步.同步锁使用Lock对象充当. java.util.concurrent.locks. ...

  10. Flu PG walkthrough Intermediate

    nmap ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.192.41 Starting Nmap 7.94SVN ( https:// ...