停止嵌套Pydantic的验证

1 投票
1 回答
34 浏览
提问于 2025-04-13 02:02

我使用一个叫做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(正确的邮箱):

撰写回答