如何在 pydantic 中听写或数据检查密钥

Rah*_*hul 6 python pydantic fastapi

class mail(BaseModel):
    mailid: int
    email: str
    
class User(BaseModel):
    id: int
    name: str
    mails: List[mail]

data1 = {
    'id': 123,
    'name': 'Jane Doe',
    'mails':[
        {'mailid':1,'email':'aeajhs@gmail.com'}, 
        {'mailid':2,'email':'aeajhsds@gmail.com'}
    ]
}
userobj = User(**data1)  # Accepted
data2 = {
        'id': 123,
        'name': 'Jane Doe',
        'mails':[
            {'mailid':1,'email':'aeajhs@gmail.com'}, 
            {'email':'aeajhsds@gmail.com'}
        ]
    }
    
userobj = User(**data2)  # Discarded or not accepted
Run Code Online (Sandbox Code Playgroud)

我想检查我们传递给 pydantic 模型的字典中的键,因此如果给定字典中不存在该键,我想丢弃该数据。例如在邮件中的data2中,{'email':'aeajhsds@gmail.com'}data2必须被丢弃

小智 5

您可以pydantic.validator按照@juanpa-arrivilillaga 所说使用。

有几个小技巧:

  • Optional验证结束时它可能为空。
  • pre=True是否应在标准验证器之前调用此验证器(否则在之后)
from pydantic import BaseModel, validator
from typing import List, Optional


class Mail(BaseModel):
    mailid: int
    email: str
    
class User(BaseModel):
    id: int
    name: str
    mails: Optional[List[Mail]]

    @validator('mails', pre=True)
    def mail_check(cls, v):
        mail_att = [i for i in Mail.__fields__.keys()]
        mail_att_count = 0
        for i, x in enumerate(v):
            for k in dict(x).keys():
                if k in mail_att:
                    mail_att_count += 1
            if mail_att_count != len(mail_att):
                v.pop(i)
            mail_att_count = 0
        return v
Run Code Online (Sandbox Code Playgroud)
data = {
    'id': 123,
    'name': 'Jane Doe',
    'mails':[
        {'mailid':1,'email':'aaa@gmail.com'},
        {'mailid':2,'email':'bbb@gmail.com'},
        {'email':'ccc@gmail.com'}
    ]
}

x = User(**data)  # Discarded or not accepted
print(x.id)
print(x.name)
print(x.mails)

# Output
# >>123
# >>Jane Doe
# >>[Mail(mailid=1, email='aaa@gmail.com'), Mail(mailid=2, email='bbb@gmail.com')]
Run Code Online (Sandbox Code Playgroud)