pydantic模型配置
1.配置参数
title
:生成的 JSON 架构的标题anystr_strip_whitespace
:是否去除 str 和字节类型的前导和尾随空格(默认值:False)anystr_lower
:是否使 str 和字节类型的所有字符都小写(默认值:False)min_anystr_length
:str & byte 类型的最小长度(默认值:0)max_anystr_length
:str & byte 类型的最大长度(默认值:None)validate_all
:是否验证字段默认值(默认值:False)extra
:在模型初始化期间,是否忽略("ignore")、允许("allow")、禁止("forbid")额外参数的传入,支持字符串,也可以直接使用Extra枚举对象ignore
:传递额外参数不报错,实例对象不会包含额外属性allow
:允许传递额外参数,实例对象可以获取到额外属性forbid
:不允许传递额外参数
allow_mutation
:模型字段初始化值是否可以被修改(默认值:__setattr__True)frozen
:此参数处于测试阶段use_enum_values
:是否使用枚举的属性(而不是原始枚举)填充模型。如果要稍后序列化,这可能很有用(默认值:value model.dict() False)fields
:包含每个字段的架构信息;这等效于使用 Field 类。fields = {'username': {'alias': 'uname'}}
validate_assignment
:是否对属性的分配执行验证(默认值:False)allow_population_by_field_name
:别名字段是否可以由 model 属性给出的名称以及别名(默认值:False)error_msg_templates
:用于覆盖默认错误消息模板。使用与要覆盖的错误消息匹配的键传入字典(默认值:dict{})orm_mode
:是否允许使用 ORM 模式schema_extra
:用于扩展/更新生成的 JSON 模式,或可调用以对其进行后处理;查看架构自定义dictjson_loads
:用于解码 JSON 的自定义函数;请参阅自定义 JSON (de)序列化json_dumps
:用于编码 JSON 的自定义函数;请参阅自定义 JSON (de)序列化json_encoders
:用于自定义将类型编码为 JSON 的方式;请参阅 JSON 序列化dictunderscore_attrs_are_private
:将任何下划线非类 var attr 视为私有,还是保留原样smart_union
:Union在组合多个类型的情况下,实例化时传参,默认按照类型顺序去判断,此时可能会出错,就需要指定该参数为True
,让其知道自己去根据传值匹配对应类型,见Smart Union
2.配置方式
2.1模型配置
- 直接在模型上进行配置
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
v: str
class Config:
max_anystr_length = 10
error_msg_templates = {
'value_error.any_str.max_length': 'max_length:{limit_value}',
}
try:
Model(v='x' * 20)
except ValidationError as e:
print(e)
"""
1 validation error for Model
v
max_length:10 (type=value_error.any_str.max_length; limit_value=10)
"""
2.2通过kwargs进行传参
from pydantic import BaseModel, ValidationError, Extra
class Model(BaseModel, extra=Extra.forbid):
a: str
try:
Model(a='spam', b='oh no')
except ValidationError as e:
print(e)
"""
1 validation error for Model
b
extra fields not permitted (type=value_error.extra)
"""
2.3使用类装饰器
from datetime import datetime
from pydantic import ValidationError
from pydantic.dataclasses import dataclass
class MyConfig:
max_anystr_length = 10
validate_assignment = True
error_msg_templates = {
'value_error.any_str.max_length': 'max_length:{limit_value}',
}
@dataclass(config=MyConfig)
class User:
id: int
name: str = 'John Doe'
signup_ts: datetime = None
user = User(id='42', signup_ts='2032-06-21T12:00')
try:
user.name = 'x' * 20
except ValidationError as e:
print(e)
"""
1 validation error for User
name
max_length:10 (type=value_error.any_str.max_length; limit_value=10)
"""
3.全局生效配置
- 通过给BaseModel增加配置即可
from pydantic import BaseModel as PydanticBaseModel
class BaseModel(PydanticBaseModel):
class Config:
arbitrary_types_allowed = True
class MyClass:
"""A random class"""
class Model(BaseModel):
x: MyClass
4.别名生成器
from pydantic import BaseModel
def to_camel(string: str) -> str:
return ''.join(word.capitalize() for word in string.split('_'))
class Voice(BaseModel):
name: str
language_code: str
class Config:
alias_generator = to_camel
voice = Voice(Name='Filiz', LanguageCode='tr-TR')
print(voice.dict()) # {'name': 'Filiz', 'language_code': 'tr-TR'}
print(voice.dict(by_alias=True)) # {'Name': 'Filiz', 'LanguageCode': 'tr-TR'}
5.别名优先级
1.直接在模型上Field(..., alias=
2.直接在模型上Config.fields fields = {'language_code': 'lang'}
3.在父模型上Field(..., alias=
4.父模型上定义在 中定义Config.fields
6.无论它是在模型上还是在父模型上alias_generator
6.Smart Union
from typing import Union
from pydantic import BaseModel
class Foo(BaseModel):
pass
class Bar(BaseModel):
pass
class Model(BaseModel):
x: Union[str, int]
y: Union[Foo, Bar]
print(Model(x=1, y=Bar()))
# x='1' y=Foo()
from typing import Union
from pydantic import BaseModel
class Foo(BaseModel):
pass
class Bar(BaseModel):
pass
class Model(BaseModel):
x: Union[str, int]
y: Union[Foo, Bar]
class Config:
smart_union = True
print(Model(x=1, y=Bar()))
# x=1 y=Bar()
- 尚不支持复合类型
from typing import List, Union
from pydantic import BaseModel
class Model(BaseModel, smart_union=True):
x: Union[List[str], List[int]]
# Expected coercion
print(Model(x=[1, '2']))
# x=['1', '2']
# Unexpected coercion
print(Model(x=[1, 2]))
# x=['1', '2']