目录
  • 概述
  • 官方文档链接
  • 基础功能
    • 基本配置
    • 示例代码
  • 进阶功能
    • 自定义验证器
  • 高级教程
    • 配置继承
    • 参数详解
  • 总结

    概述

    Pydantic是一个用于数据验证和设置管理的Python库。它可以通过类型注解来自动生成验证和解析逻辑。BaseConfig是Pydantic模型配置的基类,允许用户定制模型的行为和验证规则。

    官方文档链接

    Pydantic官方文档 – BaseConfig

    基础功能

    基本配置

    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.ignoreExtra.allowExtra.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内容请搜索小闻网以前的文章或继续浏览下面的相关文章希望大家以后多多支持小闻网!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。