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 模式,或可调用以对其进行后处理;查看架构自定义dict
  • json_loads:用于解码 JSON 的自定义函数;请参阅自定义 JSON (de)序列化
  • json_dumps:用于编码 JSON 的自定义函数;请参阅自定义 JSON (de)序列化
  • json_encoders:用于自定义将类型编码为 JSON 的方式;请参阅 JSON 序列化dict
  • underscore_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']
posted @ 2022-06-16 12:06  fatpuffer  阅读(1002)  评论(0编辑  收藏  举报