Pydantic中BaseConfig的具体使用

 更新时间:2024年06月26日 11:32:29   作者:吉小雨  
本文主要介绍了Pydantic中BaseConfig的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

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

相关文章

  • Python AI入门学习:从Hello World到线性回归、神经网络、图像分类

    Python AI入门学习:从Hello World到线性回归、神经网络、图像分类

    作为一个Rust开发者,我发现Python AI的学习过程既有挑战也有机遇,挑战在于Python的动态类型和内存管理与Rust有很大不同,需要适应新的思维方式,机遇在于Python的AI生态系统非常丰富,开发效率高,能够快速实现AI模型
    2026-03-03
  • python基于机器学习预测股票交易信号

    python基于机器学习预测股票交易信号

    近年来,随着技术的发展,机器学习和深度学习在金融资产量化研究上的应用越来越广泛和深入。目前,大量数据科学家在Kaggle网站上发布了使用机器学习/深度学习模型对股票、期货、比特币等金融资产做预测和分析的文章。本文就来看看如何用python预测股票交易信号
    2021-05-05
  • Pandas实现复制dataframe中的每一行

    Pandas实现复制dataframe中的每一行

    这篇文章主要介绍了Pandas实现复制dataframe中的每一行方式,
    2024-02-02
  • python安装/卸载模块方法步骤详解(附详细图解)

    python安装/卸载模块方法步骤详解(附详细图解)

    在日常工作中会需要安装或者卸载Python模块.于是我整理了一下,下面这篇文章主要给大家介绍了关于python安装/卸载模块的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Python结合ffmpeg 实现单线程和多线程推流

    Python结合ffmpeg 实现单线程和多线程推流

    本文主要介绍了Python结合ffmpeg 实现单线程和多线程推流,将通过两个不同的实现方式,即单线程推流和多线程推流,来展示如何利用 cv2(OpenCV)和 subprocess 等库将视频帧推送到指定的 RTMP 地址,感兴趣的可以了解一下
    2025-06-06
  • DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

    DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

    Djangorestframework-simplejwt是Django REST Framework框架的一个jwt插件,使用 python http 工具进行接口测试的方法文中给大家提到,重点给大家分享djangorestframework-simplejwt 使用记录及登陆认证的完成过程,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Python django导出excel详解

    Python django导出excel详解

    这篇文章主要介绍了Python django导出excel的方法 ,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Python 程序员必须掌握的日志记录

    Python 程序员必须掌握的日志记录

    这篇文章主要介绍了Python 日志的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • Python打印数据类型的全过程

    Python打印数据类型的全过程

    这篇文章主要介绍了Python打印数据类型的全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python使用Matplotlib画饼图

    python使用Matplotlib画饼图

    这篇文章主要介绍了python使用Matplotlib画饼图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论