ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pydantic模型配置

2022-06-16 12:36:16  阅读:320  来源: 互联网

标签:模型 配置 length str BaseModel import Model class 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']

标签:模型,配置,length,str,BaseModel,import,Model,class,pydantic
来源: https://www.cnblogs.com/puffer/p/16380714.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有