当前位置: 代码网 > it编程>前端脚本>Python > Pydantic中BaseConfig的具体使用

Pydantic中BaseConfig的具体使用

2024年07月04日 Python 我要评论
概述pydantic是一个用于数据验证和设置管理的python库。它可以通过类型注解来自动生成验证和解析逻辑。baseconfig是pydantic模型配置的基类,允许用户定制模型的行为和验证规则。官

概述

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com