首页 新闻 会员 周边

pydantic库 validator的per参数问题

0
悬赏园豆:15 [已解决问题] 解决于 2022-12-30 12:38

源码描述:

:param pre: whether or not this validator should be called before the standard validators (else after)

和在网上搜的一样都是来设置validator验证方法的执行顺序的,但是我将某个validator装饰的方法的per参数设置为True之后他的执行顺序并不是在第一位,求大佬解答

from pydantic import BaseModel, ValidationError, validator



class UserModel(BaseModel):
    name: str
    username: str
        password1:str
    password2: str




    @validator('name')
    def name_must_contain_space(cls, v,values):
        print(values,'name')
        if ' ' not in v:
            raise ValueError('must contain a space')
        # print(v.title())
        return v.title()

    @validator('password2')
    def passwords_match(cls, v, values):
        print(values,'password2')
        if 'password1' in values and v != values['password1']:
            raise ValueError('passwords do not match')
        return v

    @validator('username',pre=True)
    def username_alphanumeric(cls, v,values):
        print(values,'执行顺序优先')
        assert v.isalnum(), 'must be alphanumeric'
        return v


user = UserModel(
    name='samuel colvin',
    username='scolvin',
    password1='zxcvbn',
    password2='zxcvbn',
)        

执行结果

Ttonet的主页 Ttonet | 初学一级 | 园豆:5
提问于:2022-12-29 18:29
< >
分享
最佳答案
1

官网示例是把 @validator('username', pre=True) 放在校验定义的起始位置
自己调换下顺序 或者 在 git 提 issue

收获园豆:15
〆灬丶 | 老鸟四级 |园豆:2287 | 2022-12-30 09:43

请问你说的是将username字段放name前面顺序改为第一位吗

Ttonet | 园豆:5 (初学一级) | 2022-12-30 10:02

@Ttonet: 我指的是带 pre 关键字的装饰器放首位,你可以看下它官网的单元测试代码,感觉这是个坑

〆灬丶 | 园豆:2287 (老鸟四级) | 2022-12-30 10:25

@〆灬丶: 感谢大佬解惑,刚才我试过了得出的结果是,在执行对相同字段验证的验证器时设置pre参数可以指定他的执行顺序,仅作用在验证相同字段的验证器函数

 

Ttonet | 园豆:5 (初学一级) | 2022-12-30 12:31
〆灬丶 | 园豆:2287 (老鸟四级) | 2022-12-30 13:45

@〆灬丶: 那个*验证方法执行顺序感觉和pre设置顺序有点冲突,或者说不应该写在一起,这个*验证器里的pre参数实现的优先执行的顺序  只是在*验证器里第一次执行验证的哪个字段比另一个,验证相同字段的验证器优先而已其他的字段还是按照默认顺序验证的,实现的效果还是验证相同字段的验证器优先,其他字段的验证期还是按照默认顺序执行,我运行代码的效果是这样的不知道是不是方式不对,感觉这个验证器执行起来步骤挺复杂的

Ttonet | 园豆:5 (初学一级) | 2022-12-30 14:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册