停止嵌套Pydantic的验证
我使用一个叫做pydantic的类来创建个人资料,并对一些字段进行验证,比如邮箱地址。当我创建一个单独的个人资料时,这些验证是必要的。
但是当我一次性添加很多个人资料到一个列表中时,我希望这些验证可以不进行,因为我会在后面浏览列表时逐个检查每个个人资料。
我的想法是,如果某个个人资料不合格,我不想让整个批量处理停止。我们都知道,有时候批量处理会有一些不合格的内容。
我在创建一个个人资料时不想失去邮箱验证。
请问你们是怎么做到的呢?
class Profil(BaseModel):
pseudo: str
mail: EmailStr
page_url: str
social_network: str
created_date: datetime = Field(default_factory=datetime.now)
在我的DTO文件中进行批量插入时,我不想因为邮箱不正确而引发ValueError错误。
class InsertListProfilInputDto(BaseModel):
"""Input Dto for bulk insert of profil"""
data: list[Profil]
谢谢你。
1 个回答
0
from datetime import datetime
from pydantic import BaseModel, EmailStr, Field
class Influenceur(BaseModel):
pseudo: str
mail: EmailStr
page_url: str
social_network: str
created_date: datetime = Field(default_factory=datetime.now)
class BulkInsertInfluenceurInputDto(BaseModel):
data: list[Influenceur]
@model_validator(mode="wrap") # type: ignore
def bypass_incorrect_profil(cls, kwargs: dict[str, Any], handler):
for profil in kwargs["data"][:]:
try:
Influenceur(**profil)
except Exception:
kwargs["data"].remove(profil)
return handler(kwargs)
{
"data": [
{
"pseudo": "bob",
"mail": "bob@example.com",
"page_url": "http://example.com",
"social_network": "instagram",
"created_date": "2024-03-22T11:06:44.002Z"
},
{
"pseudo": "marc",
"mail": "marcexample.com", -------> this emailis Wrong and will raise Error in Influenceur.mail : EmailStr
"page_url": "http://example.com",
"social_network": "instagram",
"created_date": "2024-03-22T11:06:44.002Z"
}
]
}
@router.post("/")
async def bulk_insert(input_dto: BulkInsertInfluenceurInputDto):
print(input_dto)
[{'pseudo': 'bob', 'mail': 'bob@example.com', 'page_url': 'http://example.com', 'social_network': 'instagram', 'created_date': '2024-03-22T11:06:44.002Z'}]
在我的接口中,使用快速的FastAPI,并且请求体中有这些数据。
结果只返回了bob(正确的邮箱):