pydantic 常见使用

字段类型基本规则:

1、定义了字段的类型,就必须要符合要求,否则报错,如果可以转换,则能转换成对应数据类型

class A(BaseModel):
    a: str

t = A(a=1)
print(t)

 

2、可以有默认值 如msg: str = '1234'

3、set类型可以传入列表,因为会转成set

4、比较特殊的数据类型: datetime,timedelta

       Any(传入任意值包括None)

      Union  允许模型属性接受不同的类型

  

class User(BaseModel):
    id: Union[int, str, UUID]

print(User(id=1))
print(User(id='1'))
t = UUID('cf57432e-809e-4353-adbd-9d5c0d733868')
print(User(id=t))

      枚举

     

 1 class FoolEnum(str,Enum):
 2     pear = 'pear'
 3     banana = 'banana'
 4 
 5 class ToolEnum(IntEnum):
 6     spanner = 1
 7     wrench = 2
 8 
 9 class User(BaseModel):
10     fool: FoolEnum = FoolEnum.pear
11     tool: ToolEnum = ToolEnum.spanner
12 
13 print(User())
14 print(User(fool='banana',tool=2))

     bool

     Callable  可调用

1 class User(BaseModel):
2     
3     # 可调用字段仅执行参数是否可调用的简单检查;不执行参数、它们的类型或返回类型的验证
4     callback: Callable[[int], int]
5 
6 print(User(callback=lambda x:x))

  命名元组

1 class Foo(NamedTuple):
2     x: int
3     y: int
4 
5 class User(BaseModel):
6     just_subclasses: Foo
7 
8 
9 print(User(just_subclasses = Foo(x=1,y=2)))

类型化字典

 1 # `total=False` means keys are non-required
 2 class USerIdentity(TypedDict, total =False):
 3     name: str
 4     surname: str
 5 
 6 
 7 class User(TypedDict):
 8     identity:USerIdentity
 9     age: int
10 
11 
12 class Model(BaseModel):
13     u: User
14 
15     class Config:
16         extra = Extra.forbid
17 
18 
19 print(Model(u={'identity':{'name':'jake','surname':'jone'},'age':18}))
20 print(Model(u={'identity':{},'age':18}))
21 print(Model(u={'identity':{'surname':'jone'},'age':18}))

   允许任意类型

class Pet:
    def __init__(self, name:str):
        self.name = name


class Model(BaseModel):
    u: Pet

    class Config:
        # arbitrary_types_allowed中的配置 来允许任意类型
        arbitrary_types_allowed = True


print(Model(u = Pet('123')))
print(Model(u = Pet('123')).u.name)

 

     Optional  可选

5、生成器的使用

 1 def yield_demo():
 2     i = 0
 3     while True:
 4         yield i
 5         i += 1
 6 
 7 class User(BaseModel):
 8     username: Iterable[int]
 9 
10 m = User(username=yield_demo())
11 for i in m.username:
12     print(i)

 

6、类的嵌套(必须都继承了BaseModel)

class A(BaseModel):
    a: str

class B(BaseModel):
    b: str
    a: List[A]


a = {
    'b':1,
    'a':[A(a=1)]
}
t= B(**a)
print(t)

 

7、orm(必须有config类,且属性orm_mode=True)

调用方法 from_orm()

 1 from  sqlalchemy import Column, Integer, String
 2 from  sqlalchemy.ext.declarative import declarative_base
 3 
 4 Base = declarative_base()
 5 
 6 class CompanyOrm(Base):
 7 
 8     __tablename__ = 'company'
 9 
10     id = Column(Integer,primary_key=True,nullable=False)
11     name = Column(String(64),nullable=False,unique=True)
12 
13 class CompanPydantic(BaseModel):
14 
15     id: int
16     name: constr(max_length=64) # 如果有限制,则可以使用constr
17 
18     class Config:
19         orm_mode = True
20 
21 co_orm = CompanyOrm(id=1,name='233')
22 t = CompanPydantic.from_orm(co_orm)
23 print(t)  # id=1 name='233'

 

 

 

 常用方法:

 实例.dict()

实例.json()  # dict 和json一样

schema()和schema.json() 都比json()输出更多的东西

class A(BaseModel):
    a: str

a = A(a=1)
print(a.schema())
print(a.schema_json())
'''

{'title': 'A', 'type': 'object', 'properties': {'a': {'title': 'A', 'type': 'string'}}, 'required': ['a']}
{"title": "A", "type": "object", "properties": {"a": {"title": "A", "type": "string"}}, "required": ["a"]}


'''

 

实例.copy()

类.parse_obj()

类.parse_raw()

类.parse_file(file)

class A(BaseModel):
    a: str

t = A.parse_obj({'a':1})
print(t)
print(A.parse_raw('{"a":1}'))
A.parse_file(file)

 

验证器:

1、验证某个字段符合的要求

class User(BaseModel):
    name:str

     @validator('name')
    def name_must_contains_s(cls,v):
        if 's' not in v:
            raise ValidationError('must contains s')
        return v.title()

 

2、验证列表,字典等迭代数据

class User(BaseModel):
       names: List[str]
      
      @validator('names',each_item=True)
    def each_str(cls,v):
        assert v !='123'
        return v

 

3、验证某个字段如果没有默认值,我就给你一个默认值

1 class User(BaseModel):
2     id: int
3     msg: datetime = None
4    
5 
6     @validator('msg',pre=True,always=True)
7     def default_msg(cls,v):
8         return v or datetime.now()

 4、重复使用验证器

 1 def normalize(name: str) -> str:
 2     return ' '.join((word.capitalize()) for word in name.split(' '))
 3 
 4 class User(BaseModel):
 5     id: int
 6     name: str
 7 
 8     # validators
 9     _normalize_name = validator('name',allow_reuse=True)(normalize)
10 
11 class Item(BaseModel):
12     msg: str
13 
14     _normalize_name = validator('msg', allow_reuse=True)(normalize)
15 
16 print(User(id=2,name='sss zz kk'))
17 print(Item(msg="kk ll oo pp"))

5、根验证器(验证所有数据)

class User(BaseModel):
    username: str
    password1: str
    password2: str

    @root_validator
    def check_all(cls,values):
        password1, password2 = values.get('password1'), values.get('password2')

        if password1 is not None and password2 is not None and password1 != password2:
            raise ValidationError('password does not match')

        return values

print(User(username='123',password1='234',password2='2345'))

 

posted @ 2022-06-18 15:55  JakeTan  阅读(231)  评论(0)    收藏  举报