pydantic.BaseModel

Pydantic是一个数据验证和数据解析库,主要针对Python编程语言。它提供了一种简洁且高效的方法来定义和验证数据模型。其核心功能由BaseModel类实现,而通过继承BaseModel类,用户可以定义自己的数据模型,以便进行强类型验证和自动类型转换。以下是对pydantic.BaseModel的详细讲解:

基础用法

首先,你需要安装Pydantic库:

pip install pydantic

然后,你可以导入BaseModel并创建自己的数据模型类:

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    age: int = 18  # 默认值为18

# 实例化User类
user = User(id=1, name='Alice')
print(user)
# 输出: User(id=1, name='Alice', age=18)

# 验证数据类型
try:
    invalid_user = User(id='NaN', name=10)  # id应为int类型,name应为str类型
except Exception as e:
    print(e)
# 输出: 1 validation error for User
# id
#   value is not a valid integer (type=type_error.integer)
# name
#   str type expected (type=type_error.str)

Field验证

使用Field类来定义额外的验证和元数据:

from pydantic import BaseModel, Field

class Product(BaseModel):
    id: int
    name: str
    price: float = Field(..., gt=0, description="The price must be greater than 0")  # 必填项,且gt表示验证价格必须大于0

product = Product(id=101, name='Laptop', price=999.99)
print(product)
# 输出: Product(id=101, name='Laptop', price=999.99)

try:
    invalid_product = Product(id=102, name='Smartphone', price=-150.0)
except Exception as e:
    print(e)
# 输出: 1 validation error for Product
# price
#   ensure this value is greater than 0 (type=value_error.number.not_gt; limit_value=0)

数据转换和别名

Pydantic会自动处理一些数据转换工作,比如将字符串转换为整数等。另外,你可以使用alias字段来定义别名:

class Item(BaseModel):
    product_id: int
    product_name: str = Field(alias='name')

item = Item(product_id=200, name='Book')
print(item)
# 输出: Item(product_id=200, product_name='Book')

# 可以访问别名对应的数据
print(item.dict(by_alias=True))
# 输出: {'product_id': 200, 'name': 'Book'}

嵌套模型

数据模型可以相互嵌套,以表示复杂的数据结构:

class Address(BaseModel):
    street: str
    city: str
    zip_code: str

class Customer(BaseModel):
    id: int
    name: str
    address: Address

address = Address(street='123 Main St', city='New York', zip_code='10001')
customer = Customer(id=201, name='Bob', address=address)
print(customer)
# 输出: Customer(id=201, name='Bob', address=Address(street='123 Main St', city='New York', zip_code='10001'))

# 从JSON数据创建模型实例
import json

data = '''
{
    "id": 202,
    "name": "Charlie",
    "address": {
        "street": "456 Elm St",
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
'''

customer_from_json = Customer.parse_raw(data)
print(customer_from_json)
# 输出: Customer(id=202, name='Charlie', address=Address(street='456 Elm St', city='Los Angeles', zip_code='90001'))

使用自定义验证器

Pydantic还允许你定义自定义验证器,以对字段进行更复杂的验证:

from pydantic import BaseModel, validator

class UserWithCustomValidation(BaseModel):
    id: int
    username: str
    email: str

    @validator('email')
    def email_must_contain_at(cls, v):
        if '@' not in v:
            raise ValueError('Invalid email address')
        return v

try:
    user = UserWithCustomValidation(id=1, username='user1', email='invalid-email')
except Exception as e:
    print(e)
# 输出: 1 validation error for UserWithCustomValidation
# email
#   Invalid email address (type=value_error)

user = UserWithCustomValidation(id=2, username='user2', email='user2@example.com')
print(user)
# 输出: UserWithCustomValidation(id=2, username='user2', email='user2@example.com')

总结

Pydantic的BaseModel提供了一种高效且直观的方式来进行数据验证、解析和转换。通过简单地定义数据模型,Pydantic能帮你自动处理大部分琐碎的验证逻辑,大幅提升代码的可读性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值