You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证允许额外字段的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:39:32