如何访问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
相关产品推荐
相关产品推荐

