如何在Pydantic的validator方法中访问额外传入的kwargs参数
解决方案
你可以通过Pydantic内置的上下文传参功能实现需求,无需将tenantId加入模型字段,完全不会触发extra = Extra.forbid的校验规则。
Pydantic V1 版本实现
第一步:修改校验器,接收上下文参数
from pydantic import BaseModel, validator, Extra from typing import List class SendInvitePayloadValidator(BaseModel): emailId: List[str] role: str class Config: extra = Extra.forbid @validator('emailId') def validate_email(cls, emailID, values, **kwargs): # 从上下文获取tenantId tenant_id = kwargs.get('context', {}).get('tenantId') if not tenant_id: raise ValueError("缺少必要校验参数tenantId") # 此处编写你的邮箱校验逻辑,可直接使用tenant_id return emailID
第二步:调用校验时传入上下文
上下文参数需要单独传入,不要放到payload字典中,不会被识别为模型字段:
payload = { "emailId":['jeet@steinnlabs.com', 'jeet@dope.security'], "role":"Administrator", } # 单独传入context参数 validated_data = SendInvitePayloadValidator.parse_obj( payload, context={"tenantId": "你需要传入的租户ID"} )
Pydantic V2 版本实现
V2版本对上下文传参做了更规范的封装,使用ValidationInfo获取上下文参数:
第一步:修改校验器定义
from pydantic import BaseModel, ValidationInfo, field_validator from typing import List class SendInvitePayloadValidator(BaseModel): emailId: List[str] role: str model_config = { "extra": "forbid" } @field_validator('emailId') @classmethod def validate_email(cls, emailID: List[str], info: ValidationInfo): # 从上下文获取tenantId tenant_id = info.context.get('tenantId') if not tenant_id: raise ValueError("缺少必要校验参数tenantId") # 此处编写你的邮箱校验逻辑,可直接使用tenant_id return emailID
第二步:调用校验时传入上下文
payload = { "emailId":['jeet@steinnlabs.com', 'jeet@dope.security'], "role":"Administrator", } # 单独传入context参数 validated_data = SendInvitePayloadValidator.model_validate( payload, context={"tenantId": "你需要传入的租户ID"} )
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

