如何验证允许额外字段的Pydantic对象的最大大小
实现方案
你当前的模型配置已经支持接收未在Schema中声明的额外字段,只需要新增根校验器,在所有字段(包含动态传入的额外字段)解析完成后统一计算对象总大小,超过预设阈值时抛出校验错误即可满足需求。
Pydantic v1 版本实现(适配你给出的现有代码写法)
from pydantic import Extra, BaseModel, ValidationError, root_validator import json # 按需调整最大对象大小限制,单位为UTF-8字节 MAX_ALLOWED_SIZE = 200 class MyObject(BaseModel): x:int = 0 class Config: extra = Extra.allow @root_validator def validate_total_size(cls, values): # 序列化所有字段(含额外字段)计算实际字节长度 current_size = len(json.dumps(values, default=str).encode("utf-8")) if current_size > MAX_ALLOWED_SIZE: raise ValueError(f"对象大小超出限制,最大允许{MAX_ALLOWED_SIZE}字节,当前大小{current_size}字节") return values
验证效果
- 执行
MyObject(x=1, extra="value")时,对象总大小远低于阈值,可正常通过验证 - 执行
MyObject(x=1, extra="a"*1000)时,总大小远超限制,会直接抛出ValidationError异常
Pydantic v2 版本参考实现
如果你使用的是Pydantic v2版本,配置和校验器写法有调整,可参考如下实现:
from pydantic import BaseModel, ValidationError, model_validator, ConfigDict import json MAX_ALLOWED_SIZE = 200 class MyObject(BaseModel): x: int = 0 model_config = ConfigDict(extra="allow") @model_validator(mode="after") def validate_total_size(self): current_size = len(self.model_dump_json().encode("utf-8")) if current_size > MAX_ALLOWED_SIZE: raise ValueError(f"对象大小超出限制,最大允许{MAX_ALLOWED_SIZE}字节,当前大小{current_size}字节") return self
自定义调整说明
- 如果不需要按UTF-8字节计算大小,要按字符数统计的话,去掉
.encode("utf-8")直接计算序列化后字符串长度即可 - 如果有不需要计入大小的字段,序列化时传入
exclude参数过滤对应字段即可 - 阈值
MAX_ALLOWED_SIZE可根据业务实际需求自由调整
内容的提问来源于stack exchange,提问作者Mifeet
相关产品推荐
相关产品推荐

