配置
Pydantic 的行为可以通过多种配置值来控制,这些配置值记录在 ConfigDict
类中。此页面描述了如何为 Pydantic 支持的类型指定配置。
Pydantic 模型上的配置¶
在 Pydantic 模型上,可以通过两种方式指定配置
-
使用
model_config
类属性from pydantic import BaseModel, ConfigDict, ValidationError class Model(BaseModel): model_config = ConfigDict(str_max_length=5) # (1)! v: str try: m = Model(v='abcdef') except ValidationError as e: print(e) """ 1 validation error for Model v String should have at most 5 characters [type=string_too_long, input_value='abcdef', input_type=str] """
- 也可以使用纯字典(例如
{'str_max_length': 5}
)。
注意
在 Pydantic V1 中,使用了
Config
类。这仍然受支持,但已弃用。 - 也可以使用纯字典(例如
-
使用类参数
from pydantic import BaseModel class Model(BaseModel, frozen=True): a: str # (1)!
- 与
model_config
类属性不同,静态类型检查器将识别frozen
参数,因此任何实例突变都将被标记为类型检查错误。
- 与
Pydantic 数据类上的配置¶
Pydantic 数据类 也支持配置(在专用部分中阅读更多内容)。
from pydantic import ConfigDict, ValidationError
from pydantic.dataclasses import dataclass
@dataclass(config=ConfigDict(str_max_length=10, validate_assignment=True))
class User:
name: str
user = User(name='John Doe')
try:
user.name = 'x' * 20
except ValidationError as e:
print(e)
"""
1 validation error for User
name
String should have at most 10 characters [type=string_too_long, input_value='xxxxxxxxxxxxxxxxxxxx', input_type=str]
"""
TypeAdapter
上的配置¶
类型适配器(使用 TypeAdapter
类)通过提供 config
参数来支持配置。
from pydantic import ConfigDict, TypeAdapter
ta = TypeAdapter(list[str], config=ConfigDict(coerce_numbers_to_str=True))
print(ta.validate_python([1, 2]))
#> ['1', '2']
其他支持类型上的配置¶
如果您正在使用 标准库数据类 或 TypedDict
类,则可以通过两种方式设置配置
-
使用
__pydantic_config__
类属性from dataclasses import dataclass from pydantic import ConfigDict @dataclass class User: __pydantic_config__ = ConfigDict(strict=True) id: int name: str = 'John Doe'
-
使用
with_config
装饰器(这避免了TypedDict
的静态类型检查错误)from typing_extensions import TypedDict from pydantic import ConfigDict, with_config @with_config(ConfigDict(str_to_lower=True)) class Model(TypedDict): x: str
全局更改行为¶
如果您希望全局更改 Pydantic 的行为,您可以创建自己的自定义父类并使用自定义配置,因为配置是继承的
from pydantic import BaseModel, ConfigDict
class Parent(BaseModel):
model_config = ConfigDict(extra='allow')
class Model(Parent):
x: str
m = Model(x='foo', y='bar')
print(m.model_dump())
#> {'x': 'foo', 'y': 'bar'}
如果您为子类提供配置,它将与父配置合并
from pydantic import BaseModel, ConfigDict
class Parent(BaseModel):
model_config = ConfigDict(extra='allow', str_to_lower=False)
class Model(Parent):
model_config = ConfigDict(str_to_lower=True)
x: str
m = Model(x='FOO', y='bar')
print(m.model_dump())
#> {'x': 'foo', 'y': 'bar'}
print(Model.model_config)
#> {'extra': 'allow', 'str_to_lower': True}
配置传播¶
请注意,当使用支持配置的类型作为其他类型的字段注解时,配置将不会被传播。在以下示例中,每个模型都有其自己的“配置边界”
from pydantic import BaseModel, ConfigDict
class User(BaseModel):
name: str
class Parent(BaseModel):
user: User
model_config = ConfigDict(str_max_length=2)
print(Parent(user={'name': 'John Doe'}))
#> user=User(name='John Doe')