python pydantic可以在更新时验证字段,同时仍然使用未提供给构造函数的可选字段

ghhkc1vu  于 2023-03-21  发布在  Python
关注(0)|答案(1)|浏览(204)

我有一个简单的pydantic类,其中有1个可选字段和一个带约束的必填字段。我想确保在创建和更新时验证约束项,同时保持可选字段可选。
如果我不使用MyConfig dataclass属性和validate_assignment属性true,我可以创建没有table_key属性的项目,但允许s3_target.target = 'BadPath'代码行。如果我不包括dataclass属性,那么我不必在创建时提供table_key,但允许s3_target更新行运行。
有没有什么方法可以让pydantic同时支持这两种场景?

from pydantic.dataclasses import dataclass
from pydantic import BaseModel, constr

from pydantic.class_validators import Optional

class MyConfig:
    validate_assignment = True

@dataclass(config=MyConfig)
class S3Target(BaseModel):
    table_key: Optional[str] = None
    # target: str = Field(regex=r'^s3://([^/]+)/(.*?([^/]+))/$', description="must be a valid s3 path", )
    target: constr(regex=r'^s3://([^/]+)/(.*?([^/]+))/$')

s3_target = S3Target(target='s3://bucket/location/')
s3_target.target = 'BadPath'

我尝试添加dataclass with validate_assignment=true,并期望Optional Field保持可选,不必将其传递到S3Target构造函数。我尝试将validate_assignment设置为False,它也不允许在没有table_key的情况下创建项。

unftdfkk

unftdfkk1#

Pydantic支持通过ModelConfig类上的validate_assignment选项进行赋值验证。将其设置为True以获得所需的行为。

class S3Target(BaseModel):
    table_key: Optional[str] = None
    # target: str = Field(regex=r'^s3://([^/]+)/(.*?([^/]+))/$', description="must be a valid s3 path", )
    target: constr(regex=r'^s3://([^/]+)/(.*?([^/]+))/$')

    class Config:
        validate_assignment = True

不需要使用dataclass装饰器来实现这种行为。(我不知道如何在使用数据类装饰器时获得这种行为)

相关问题