数据库
首页 > 数据库> > Python数据建模/解析库Pydantic详细介绍和实操讲解

Python数据建模/解析库Pydantic详细介绍和实操讲解

作者:互联网

Pydantic 是一个用于数据建模/解析的 Python 库,具有高效的错误处理和自定义验证机制。截至今天,Pydantic主要用于FastAPI框架中,用于解析请求和响应,因为Pydantic内置了对JSON编码和解码的支持。

本文涵盖以下主题:

基本模型

对于 Pydantic 中的数据建模,我们需要定义一个继承自类和字段的类。自定义验证逻辑位于同一模型类中。让我们通过 JSON 解析的简单示例来理解。考虑一个表示用户数据的 JSON。BaseModel

输入

data = {"id":20, "name":"John", "age":42, "dept":"IT"}

对于解析,首先,我们需要导入并声明一个类,它继承自 .BaseModelUserBaseModel
1 from pydantic import BaseModel
2 from pprint import print
3 data = {"id":20, "name":"John", "age":42, "dept":"IT"}
4 class User(BaseModel):
5    id: int
6    name: str
7    age: int
8    dept: str

接下来,需要从类中实例化一个对象:User
1、user = User(**data)
2、pprint(user)

输出

User(id=20, name='John', age=42, dept='IT') 


在皮丹蒂克语中可选

类中的属性可以声明为 .如果我们不确定是否存在任何 JSON 字段,我们可以将该特定类型声明为 如果缺少该字段,默认情况下,如果未使用默认值初始化属性,则返回。在示例中,让我们完全删除该字段:UserOptionalOptionalOptionalNonedept
1 from pydantic import BaseModel
2 from typing import Optional
3 from pprint import pprint
4 data = {"id":20, "name":"John", "age":42}
5 class User(BaseModel):
6 id: int
7 name: str
8 age: int
9 dept: Optional[str]
10 user = User(**data)
11  pprint(user)

输出

字段值为 ,因为它在输入数据中缺失。deptNone

User(id=20, name='John', age=42, dept=None)


皮丹蒂语中的验证

在 Pydantic 中,要获得更精细的错误细节,开发人员需要使用 / block。错误类型为 。tryexceptpydantic.error_wrappers.ValidationError

在我们的 JSON 数据中,将字段修改为字符串,然后导入 .idValidationError

输入数据

data = {"id":"default", "name":"John", "age":42}

程序
1 from pydantic import BaseModel, ValidationError
2 from typing import Optional
3 from pprint import pprint
4 data = {"id":"default", "name":"John", "age":42}
5 class User(BaseModel):
6    id: int
7    name: str
8    age: int
9    dept: Optional[str]
10 try:
11    user = User(**data)
12    pprint(user)
13 except ValidationError as error:
14    pprint(error)

错误
ValidationError(model='User', errors=[{'loc': ('id',), 'msg': 'value is not a valid integer', 'type': 'type_error.integer'}])

该错误可以表示为 JSON,以提高可读性:
1 try:
2    user = User(**data)
3    pprint(user)
4 except ValidationError as error:
5    print(error.json())
这将返回 JSON:
[

  {

    "loc": [

      "id"

    ],

    "msg": "value is not a valid integer",

    "type": "type_error.integer"

  }

]

自定义验证 

Pydantic 具有用于自定义属性验证的有用装饰器。开发人员需要导入 Pydantic 装饰器并编写我们的自定义验证逻辑;例如,如果字段的长度少于 3 个字符,则会引发错误。validatorname

输入数据

data = {"id":10, "name":"ab", "age":42}
程序
from pydantic import BaseModel, ValidationError, validator
from typing import Optional
from pprint import pprint

data = {"id":10, "name":"ab", "age":42}


class User(BaseModel):
id: int
name: str
age: int
dept: Optional[str]

@validator('name')
def validate_name(cls, name):
print('Length of Name:', len(name))
if len (name) < 3:
raise ValueError('Name length must be > 3')
return name

try:
user = User(**data)
print(user)
except ValidationError as e:
 print(e.json())

错误
[

  {

    "loc": [

      "name"

    ],

    "msg": "Name length must be > 3",

    "type": "value_error"

  }

]

电子邮件验证

涵盖电子邮件验证的原因是可以利用 Pydantic 自定义可选库。您需要从模块导入。使用装饰器,我们需要做的就是调用数据。email-validatorvalidate_emailemail_validator@validatorvalidate_email

输入数据

data = {"id":20, "name":"Sameer", "age":42, "email":"sameer@abc.com"}

程序
from pydantic import BaseModel, ValidationError, validator, Required

from typing import Optional

from pprint import pprint

from email_validator import validate_email



class User(BaseModel):

    id: int

    name: str

    age: int

    dept: Optional[str]

    email: str



    @validator('name')

    def validateName(cls, name):

        print('Length of Name:', len(name))

        if (len(name) < 3):

            raise ValueError('Name length must be > 3')

        return name



    @validator('email')

    def validateEmail(cls, email):

        valid_email = validate_email(email)

        return valid_email.email

try:

    user = User(**data)

    pprint(user)

except ValidationError as e:

    print(e.json())

输出

User(id=20, name='Sameer', age=42, dept=None, email='sameer@abc.com')

 

让我们将 的值更改为不正确:emailemail-id

data = {"id":20, "name":"Sameer", "age":42, "email":"sameer"}

它清楚地表明标志丢失了。提供正确的 后,它会按顺序返回所有内容。


结论

Pydantic可以与任何基于Python的框架一起使用,它也支持本机JSON编码和解码。正如我们在整篇文章中所看到的,采用 Pydantic 很简单,它有各种内置类和装饰器,有助于高效的数据建模、验证和错误处理。


 

标签:Python,编辑,管理,代码,数据,数据建模,分析库,Pydantic
来源: