pydantic之进阶

575 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

使用 Python 类型注释的数据验证和设置管理。

pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。

定义数据应该如何在纯正的、规范的 Python 中;用pydantic验证它。

List 列表校验值

from typing import List  
from pydantic import BaseModel
class Order(BaseModel):  
    id: int  
    name = "tom"  
    items: List[str]order = Order(id=1, items=['grape', 'apple'])

这样就可以帮我们检查list的数值了

然后跟上面一样会帮我们做转换

>>> order = Order(id=1, items=['grape', 123])  
>>> print(order.json())  
{"id": 1, "name": "tom", "items": ["grape", "123"]}

Optional

可填可不填的参数,上面有利用“=” 来表达optional的概念,但是有时我们的default可能会使用None,这样我们的datatype就会被顶掉,那么这个时间就要使用Optional了

from typing import List, Optional  
from pydantic import BaseModel

class Order(BaseModel):  
    id: int  
    name: Optional[str] = None  
    items: List[str]

上面的例子就是将“name”这个地方的默认值改成预设的None,如果有输入值,则要求这个值是str的格式。

Dict

就是字典 dictionary

from typing import List, Optional, Dict  
from pydantic import BaseModel
class Order(BaseModel):  
    id: int  
    name: Optional[str] = None  
    items: List[str]  
    item_prices: Dict[str, int]

Dict的第一个值代表key的datatype,第二则是value的datatype

>>> order = Order(id=1, items=['grape'], item_prices={'grape': 5}  
>>> order = Order(id=1, items=['grape'], item_prices={'grape': "h"}  
...  
pydantic.error_wrappers.ValidationError: 1 validation error for Order

嵌套

在 BaseModel 里面嵌套 BaseModel

from typing import List, Optional, Dict  
from pydantic import BaseModel
class User(BaseModel):  
    name: str
    
class Order(BaseModel):  
    id: int  
    user: User  
    items: List[str]

要先将要组合进去的 class 提前声明!不然提示 NameError

>>> order = Order(id=1, user={"name": "kiwi"}, items=['banana'])  
>>> print(order.json())  
{"id": 1, "user": {"name": "kiwi"}, "items": ["banana"]}  
>>> print(order.user.json())  
{"name": "kiwi"}

更进阶的!

只讲少一点,做一个引入,感兴趣的同学可以自行研究

继承

class User(BaseModel):  
    name: str
    
class SuperUser(User):  
    age: int = 18

ORM

可以将 orm model 汇入到 pydantic 的 model 内,像是 sqlalchemy

class Item(BaseModel):  
    name: str  
    price: int  
    class Config:  
        orm_mode = True

额外的 Field

真对没有列在 model 的 key-value 改如何处理?有三种方法forbid/ignore/allow

  • forbid: 禁止
  • ignore: 忽略
  • allow: 允许
class Item(BaseModel):  
    name: str  
    price: int  
class Config:  
    extra = "forbid"

Validator

检查参数是否需要额外的校验规则

from pydantic import BaseModel, ValidationError, validator  
class Model(BaseModel):  
    foo: str 
    
    @validator('foo')  
    def value_must_equal_bar(cls, v):  
        if v != 'bar':  
        raise ValueError('value must be "bar"')  
        return v