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

如何访问Pydantic Schema的字段及获取字段校验属性?

如何更优雅地获取Pydantic Schema的字段校验属性?

你当前使用Pydantic定义的Schema如下:

class MvnoaBase(BaseModel):
    """
    Shared properties for mvnoa schema
    """
    name: str = Field(min_length=1, max_length=100)
    is_active: bool

在PyTest测试中,你通过model_fields的metadata索引获取字段校验属性,但这种方式依赖metadata列表的顺序,不够鲁棒。下面提供几种更可靠的替代方法:

方法1:按类型遍历metadata获取校验规则

不用硬编码索引,通过类型匹配定位对应的校验实例,避免因metadata顺序变化导致的错误:

def test_validate_length_create_mvnoa_schema(client: TestClient, mvnoa_in, expected_code):
    mvnoa_in = schemas.MVNOACreate(name=mvnoa_in['name'],
                                   is_active=mvnoa_in['is_active'])
    mvnoa_db = client.post('api/v1/mvnoa/', json=mvnoa_in.model_dump())
    
    name_field = schemas.MVNOACreate.model_fields['name']
    # 获取max_length规则
    max_len_rule = next(item for item in name_field.metadata if isinstance(item, MaxLen))
    assert len(mvnoa_in['name']) <= max_len_rule.max_length
    
    # 同理获取min_length规则
    min_len_rule = next(item for item in name_field.metadata if isinstance(item, MinLen))
    assert len(mvnoa_in['name']) >= min_len_rule.min_length

方法2:从JSON Schema中提取校验属性

Pydantic支持将模型转换为JSON Schema,可从中直接读取标准化的校验字段:

def test_validate_length_create_mvnoa_schema(client: TestClient, mvnoa_in, expected_code):
    mvnoa_in = schemas.MVNOACreate(name=mvnoa_in['name'],
                                   is_active=mvnoa_in['is_active'])
    mvnoa_db = client.post('api/v1/mvnoa/', json=mvnoa_in.model_dump())
    
    # 获取模型的JSON Schema
    json_schema = schemas.MVNOACreate.model_json_schema()
    name_schema = json_schema['properties']['name']
    
    assert len(mvnoa_in['name']) <= name_schema['maxLength']
    assert len(mvnoa_in['name']) >= name_schema['minLength']

方法3:提前封装校验规则(复用场景)

如果需要频繁复用这些校验值,可以在定义Schema时将规则存为变量,测试中直接调用:

# 提前定义校验规则常量
NAME_MIN_LENGTH = 1
NAME_MAX_LENGTH = 100

class MvnoaBase(BaseModel):
    """
    Shared properties for mvnoa schema
    """
    name: str = Field(min_length=NAME_MIN_LENGTH, max_length=NAME_MAX_LENGTH)
    is_active: bool

# 测试中直接使用常量
def test_validate_length_create_mvnoa_schema(client: TestClient, mvnoa_in, expected_code):
    mvnoa_in = schemas.MVNOACreate(name=mvnoa_in['name'],
                                   is_active=mvnoa_in['is_active'])
    mvnoa_db = client.post('api/v1/mvnoa/', json=mvnoa_in.model_dump())
    
    assert len(mvnoa_in['name']) <= NAME_MAX_LENGTH
    assert len(mvnoa_in['name']) >= NAME_MIN_LENGTH

这几种方法都比直接索引metadata更可靠:方法1、2适合动态从模型获取规则,方法3适合需要复用校验值的场景。

内容的提问来源于stack exchange,提问作者Carlos Ochoa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:17