Pydantic中BaseConfig的具体使用
作者:吉小雨
概述
Pydantic是一个用于数据验证和设置管理的Python库。它可以通过类型注解来自动生成验证和解析逻辑。BaseConfig
是Pydantic模型配置的基类,允许用户定制模型的行为和验证规则。
官方文档链接
基础功能
基本配置
BaseConfig
提供了许多选项来配置Pydantic模型的行为。下面是一些常用的配置选项:
title
: 给模型一个标题。anystr_strip_whitespace
: 自动去除字符串前后的空白。min_anystr_length
: 字符串的最小长度。max_anystr_length
: 字符串的最大长度。validate_assignment
: 在模型实例创建后进行属性分配时验证。
示例代码
from pydantic import BaseModel class User(BaseModel): name: str age: int class Config: title = "User Model" anystr_strip_whitespace = True min_anystr_length = 2 max_anystr_length = 50 validate_assignment = True # 创建模型实例 user = User(name=" John Doe ", age=30) print(user.name) # 输出: "John Doe"
在这个例子中,User
模型去除了name
字段的前后空白,并设置了字符串的最小和最大长度。
进阶功能
自定义验证器
可以在配置类中定义自定义验证器来增加验证逻辑。
from pydantic import BaseModel, validator class User(BaseModel): name: str age: int class Config: validate_assignment = True @validator('age') def age_must_be_positive(cls, value): if value <= 0: raise ValueError('Age must be a positive number') return value # 创建模型实例 user = User(name="Jane Doe", age=25) # 赋值时验证 user.age = 30 # 成功 user.age = -5 # 抛出 ValueError: Age must be a positive number
高级教程
配置继承
可以通过继承BaseConfig
类创建一个通用的配置类,并在多个模型中复用。
from pydantic import BaseModel class CommonConfig: anystr_strip_whitespace = True min_anystr_length = 2 max_anystr_length = 50 class User(BaseModel): name: str age: int class Config(CommonConfig): title = "User Model" class Product(BaseModel): name: str price: float class Config(CommonConfig): title = "Product Model" # 创建模型实例 user = User(name=" John Doe ", age=30) product = Product(name=" Laptop ", price=999.99) print(user.name) # 输出: "John Doe" print(product.name) # 输出: "Laptop"
通过这种方式,可以将公共配置集中管理,减少重复代码。
参数详解
1. title
为模型指定一个标题。
from pydantic import BaseModel class User(BaseModel): name: str age: int class Config: title = "User Model" print(User.schema()) # 输出包含 "title": "User Model"
2. anystr_lower
将所有字符串转换为小写。
class User(BaseModel): name: str class Config: anystr_lower = True user = User(name="John Doe") print(user.name) # 输出: "john doe"
3. anystr_strip_whitespace
去除字符串前后的空白。
class User(BaseModel): name: str class Config: anystr_strip_whitespace = True user = User(name=" John Doe ") print(user.name) # 输出: "John Doe"
4. min_anystr_length
字符串的最小长度。
class User(BaseModel): name: str class Config: min_anystr_length = 2 # user = User(name="A") # 将抛出验证错误 user = User(name="Ab") print(user.name) # 输出: "Ab"
5. max_anystr_length
字符串的最大长度。
class User(BaseModel): name: str class Config: max_anystr_length = 10 # user = User(name="John Doe Long Name") # 将抛出验证错误 user = User(name="John Doe") print(user.name) # 输出: "John Doe"
6. validate_all
验证所有字段,而不仅仅是提供的数据字段。
class User(BaseModel): name: str age: int class Config: validate_all = True # user = User(name="John") # 将抛出验证错误,因为缺少age字段 user = User(name="John", age=30) print(user) # 输出: name='John' age=30
7. extra
决定在模型中是否允许额外的字段。选项有Extra.ignore
, Extra.allow
, Extra.forbid
。
from pydantic import Extra class User(BaseModel): name: str class Config: extra = Extra.forbid # user = User(name="John", age=30) # 将抛出验证错误,因为age是多余字段 user = User(name="John") print(user) # 输出: name='John'
8. allow_mutation
是否允许修改模型实例的属性。
class User(BaseModel): name: str class Config: allow_mutation = False user = User(name="John") # user.name = "Doe" # 将抛出验证错误,因为模型不可变 print(user.name) # 输出: "John"
9. frozen
如果为True,则模型实例将是不可变的(与allow_mutation
相同)。
class User(BaseModel): name: str class Config: frozen = True user = User(name="John") # user.name = "Doe" # 将抛出验证错误,因为模型是冻结的 print(user.name) # 输出: "John"
10. allow_population_by_field_name
是否允许通过字段名称填充数据,而不是别名。
class User(BaseModel): full_name: str class Config: allow_population_by_field_name = True fields = { 'full_name': 'name' } user = User(name="John Doe") print(user.full_name) # 输出: "John Doe"
11. use_enum_values
使用枚举值而不是枚举实例。
from enum import Enum class Color(Enum): RED = 'red' BLUE = 'blue' class Car(BaseModel): color: Color class Config: use_enum_values = True car = Car(color=Color.RED) print(car.color) # 输出: "red"
12. fields
字段的配置信息,字典形式,键为字段名,值为别名或包含别名及其他配置信息的字典。
class User(BaseModel): name: str class Config: fields = { 'name': {'alias': 'full_name'} } user = User(full_name="John Doe") print(user.name) # 输出: "John Doe"
13. validate_assignment
分配新值时验证字段。
class User(BaseModel): age: int class Config: validate_assignment = True user = User(age=25) user.age = 30 # user.age = -5 # 将抛出验证错误,因为age必须是正整数 print(user.age) # 输出: 30
14. error_msg_templates
自定义错误消息模板。
class User(BaseModel): age: int class Config: error_msg_templates = { 'value_error': 'Invalid value provided.' } # user = User(age=-5) # 将抛出验证错误: Invalid value provided. user = User(age=25) print(user.age) # 输出: 25
15. arbitrary_types_allowed
允许使用任意类型。
class CustomType: pass class User(BaseModel): custom: CustomType class Config: arbitrary_types_allowed = True user = User(custom=CustomType()) print(user.custom) # 输出: <__main__.CustomType object at 0x...>
16. orm_mode
启用ORM支持,允许从ORM对象填充数据。
class UserOrm: def __init__(self, name): self.name = name class User(BaseModel): name: str class Config: orm_mode = True user_orm = UserOrm(name="John Doe") user = User.from_orm(user_orm) print(user.name) # 输出: "John Doe"
17. getter_dict
自定义getter字典类。
class CustomGetterDict(GetterDict): def get(self, item, default=None): return f'custom_{super().get(item, default)}' class User(BaseModel): name: str class Config: getter_dict = CustomGetterDict data = {'name': 'John Doe'} user = User.parse_obj(data) print(user.name) # 输出: "custom_John Doe"
18. alias_generator
别名生成器函数,用于自动生成字段别名。
class User(BaseModel): full_name: str class Config: alias_generator = lambda x: x.upper() user = User(FULL_NAME="John Doe") print(user.full_name) # 输出: "John Doe"
19. keep_untouched
保持未修改的类型元组。
class SomeType: pass class User(BaseModel): some: SomeType class Config: keep_untouched = (SomeType,) user = User(some=SomeType()) print(user.some) # 输出: <__main__.SomeType object at 0x...>
20. schema_extra
额外的JSON模式定义,可以是字典或返回字典的可调用对象。
class User(BaseModel): name: str age: int class Config: schema_extra = { "example": { "name": "John Doe", "age": 30 } } print(User.schema_json(indent=2)) # 输出包含 "example": {"name": "John Doe", "age": 30}
21. json_loads
自定义JSON加载函数。
import json def custom_json_loads(value): return json.loads(value) class User(BaseModel): name: str class Config: json_loads = custom_json_loads user = User.parse_raw('{"name": "John Doe"}') print(user.name) # 输出: "John Doe"
22. json_dumps
自定义JSON序列化函数。
import json def custom_json_dumps(value, **kwargs): return json.dumps(value, **kwargs) class User(BaseModel): name: str class Config: json_dumps = custom_json_dumps user = User(name="John Doe") print(user.json()) # 输出: {"name": "John Doe"}
23. json_encoders
自定义JSON编码器字典,键为类型或字符串,值为编码函数。
from datetime import datetime class User(BaseModel): created_at: datetime class Config: json_encoders = { datetime: lambda v: v.isoformat() } user = User(created_at=datetime(2020, 1, 1)) print(user.json()) # 输出: {"created_at": "2020-01-01T00:00:00"}
24. underscore_attrs_are_private
以下划线开头的属性是否被视为私有。
class User(BaseModel): _private: str class Config: underscore_attrs_are_private = True user = User(_private="secret") print(user.dict()) # 输出: {}
25. copy_on_model_validation
是否在模型验证时复制继承的模型。
class BaseModelWithConfig(BaseModel): class Config: copy_on_model_validation = True class User(BaseModelWithConfig): name: str user = User(name="John") print(user.name) # 输出: "John"
26. smart_union
是否在尝试转换前检查所有允许的类型。
from typing import Union class User(BaseModel): value: Union[int, str] class Config: smart_union = True user = User(value="123") print(user.value) # 输出: "123"
希望这些示例代码能帮助你更好地理解Pydantic中BaseConfig
类的各个参数及其用法。
总结
BaseConfig
提供了强大的配置选项,使得Pydantic模型更加灵活和可定制。通过掌握这些配置选项,可以更加高效地进行数据验证和管理。
到此这篇关于Pydantic中BaseConfig的具体使用的文章就介绍到这了,更多相关Pydantic BaseConfig内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!