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. net core 中的[FromBody]

    一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...

  2. 微服务实战系列(六)-网关springcloud zuul-copy

    1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zuul,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...

  3. biancheng-Spring Cloud教程

    目录http://c.biancheng.net/springcloud/ 1微服务是什么2Spring Cloud是什么3Spring Cloud Eureka4Spring Cloud Ribbo ...

  4. 项目PMP之一项目管理介绍

    一.项目定义: 概要:为创造独特的产品.服务或成果而进行的临时性工作 组织创造价值和效益.项目驱动变更创造商业价值的主要方式 特性/要素: 独特的产品.服务或成果,即一个或多个可交付成果(范围.进度( ...

  5. 一个奇葩的SQL题,够强大。

    困惑描述: 现有一张图片表,表里一个sort字段,这个字段是不重复的.不连续的数字.大致结构如下 create table Imgs( `id` bigint(20) NOT NULL AUTO_IN ...

  6. 【运维必看】Linux命令之lsblk命令

    一.命令简介 lsblk命令的英文是"list block",即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息.块设备有硬盘,闪存盘,C ...

  7. .NET周刊【2月第1期 2025-02-02】

    国内文章 dotnet 9 已知问题 默认开启 CET 导致进程崩溃 https://www.cnblogs.com/lindexi/p/18700406 本文记录 dotnet 9 的一个已知且当前 ...

  8. 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)

    一.基础信息 1.硬件环境: CPU >= 2 Core 显存/RAM ≥ 16 GiB(推荐) 2.软件 (1)Ollama Ollama 是一款跨平台的大模型管理客户端(MacOS.Wind ...

  9. npcap实战抓包教程

    npcap 是一个用于 Windows 系统的网络抓包库,基于 WinPcap 的改进版本,支持最新的 Windows 特性和协议(如 IPv6).它通常与 Wireshark 或 Nmap 等工具一 ...

  10. Drasi Reactions SDK

    Drasi Reactions SDK 是一个跨语言的开发工具包,用于实现和处理 Drasi 平台的 Reactions(反应器)功能.该 SDK 目前支持三种主流编程语言:JavaScript/Ty ...