Pydantic中model_validator的實(shí)現(xiàn)
引言
在 Pydantic 中,除了可以使用 field_validator 裝飾器對(duì)單個(gè)字段進(jìn)行驗(yàn)證外,還可以使用 model_validator 裝飾器對(duì)整個(gè)模型進(jìn)行驗(yàn)證。model_validator 允許您在字段級(jí)驗(yàn)證之后,對(duì)模型的整個(gè)數(shù)據(jù)進(jìn)行額外的驗(yàn)證。在本教程中,我們將探討如何使用 model_validator 裝飾器來(lái)創(chuàng)建自定義的模型驗(yàn)證邏輯。
基礎(chǔ)知識(shí)
在開(kāi)始之前,請(qǐng)確保您已經(jīng)安裝了 Pydantic。如果沒(méi)有,請(qǐng)使用以下命令安裝:
pip install pydantic
創(chuàng)建 Pydantic 模型
首先,讓我們創(chuàng)建一個(gè)簡(jiǎn)單的 Pydantic 模型。這個(gè)模型將包含兩個(gè)字段:a 和 b。
from pydantic import BaseModel
class Model(BaseModel):
a: str
b: int
使用 model_validator 裝飾器
model_validator 裝飾器允許您為模型添加自定義驗(yàn)證邏輯。要使用它,請(qǐng)按照以下步驟操作:
導(dǎo)入 model_validator: 從 pydantic 導(dǎo)入 model_validator。
from pydantic import BaseModel, model_validator
定義驗(yàn)證函數(shù): 創(chuàng)建一個(gè)類方法,該方法接受一個(gè)參數(shù)(模型的 dict 表示)并返回驗(yàn)證后的模型。
class Model(BaseModel):
a: str
b: int
@model_validator
@classmethod
def check_a_and_b(cls, values: dict):
if values['a'] != ' foobar ':
raise ValueError('Field "a" must contain " foobar "')
if values['b'] < 10:
raise ValueError('Field "b" must be at least 10')
return cls(**values)
在這個(gè)例子中,我們定義了一個(gè)名為 check_a_and_b 的驗(yàn)證函數(shù),它檢查 a 字段的值是否包含子字符串 " foobar ",以及 b 字段的值是否至少為 10。
3. 應(yīng)用裝飾器: 使用 @model_validator 語(yǔ)法將裝飾器應(yīng)用于驗(yàn)證函數(shù)。
4. 測(cè)試模型: 創(chuàng)建模型實(shí)例并測(cè)試驗(yàn)證邏輯。
# 正確的值
model = Model(a=' foobar ', b=20)
print(model)
# 錯(cuò)誤的值
try:
model = Model(a='snap', b=5)
except ValidationError as exc_info:
print(exc_info)
在上面的例子中,第一個(gè)模型實(shí)例成功創(chuàng)建,因?yàn)?nbsp;a 字段的值包含 " foobar " 并且 b 字段的值至少為 10。第二個(gè)實(shí)例創(chuàng)建失敗,因?yàn)?nbsp;a 字段的值不包含 " foobar ",并且 b 字段的值小于 10,因此拋出了 ValidationError。
高級(jí)用法
model_validator 裝飾器還支持一些高級(jí)功能,如:
自定義驗(yàn)證模式: 通過(guò)設(shè)置 mode 參數(shù),可以指定驗(yàn)證是在字段驗(yàn)證前還是驗(yàn)證后進(jìn)行。
@model_validator(mode='before')
檢查字段存在性: 通過(guò)設(shè)置 check_fields 參數(shù),可以控制是否檢查字段是否實(shí)際存在于模型中。
@model_validator(check_fields=False)
model_validator 裝飾器源碼
以下是 model_validator 裝飾器的簡(jiǎn)化版源碼:
def model_validator(mode: ModelValidatorModes = 'after', check_fields: bool | None = None) -> Callable[[Any], Any]:
def dec(f: Callable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any]) -> _decorators.PydanticDescriptorProxy[Any]:
if _decorators.is_instance_method_from_sig(f):
raise PydanticUserError(
'`@model_validator` cannot be applied to instance methods', code='validator-instance-method'
)
# auto apply the @classmethod decorator
f = _decorators.ensure_classmethod_based_on_signature(f)
dec_info = _decorators.ModelValidatorDecoratorInfo(mode=mode, check_fields=check_fields)
return _decorators.PydanticDescriptorProxy(f, dec_info)
return dec
源碼解讀
裝飾器定義:
model_validator 函數(shù)定義了一個(gè)裝飾器,它接受兩個(gè)可選的關(guān)鍵字參數(shù):mode 和 check_fields。
內(nèi)部函數(shù) dec:
dec是一個(gè)內(nèi)部函數(shù),它接受一個(gè)可調(diào)用對(duì)象f作為參數(shù),并返回一個(gè)_decorators.PydanticDescriptorProxy對(duì)象。- 代碼首先檢查
f是否是實(shí)例方法。如果是,拋出PydanticUserError,因?yàn)?nbsp;model_validator不能應(yīng)用于實(shí)例方法。 - 然后,確保
f是一個(gè)類方法。 - 創(chuàng)建一個(gè)包含模式和字段檢查標(biāo)志的
_decorators.ModelValidatorDecoratorInfo對(duì)象。 - 最后,返回一個(gè)
_decorators.PydanticDescriptorProxy對(duì)象,它包裝了原始的函數(shù)f和模型驗(yàn)證信息。
返回 dec:
model_validator 函數(shù)返回 dec 函數(shù),它將作為裝飾器應(yīng)用于驗(yàn)證函數(shù)。
結(jié)論
在本教程中,我們學(xué)習(xí)了如何使用 Pydantic 的 model_validator 裝飾器來(lái)為模型添加自定義驗(yàn)證邏輯。通過(guò)這個(gè)強(qiáng)大的工具,您可以對(duì)整個(gè)模型的數(shù)據(jù)進(jìn)行復(fù)雜的驗(yàn)證,從而確保數(shù)據(jù)的準(zhǔn)確性和完整性。
到此這篇關(guān)于Pydantic中model_validator的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pydantic model_validator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳談python read readline readlines的區(qū)別
下面小編就為大家?guī)?lái)一篇詳談python read readline readlines的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
python pip配置國(guó)內(nèi)鏡像源的方法(永久和臨時(shí))
在使用 pip 安裝 Python 模塊時(shí),默認(rèn)的國(guó)外鏡像源可能會(huì)導(dǎo)致下載速度緩慢甚至超時(shí),為了解決這個(gè)問(wèn)題,可以使用國(guó)內(nèi)的鏡像源來(lái)加速下載,以下是常用的國(guó)內(nèi)鏡像源以及臨時(shí)和永久的配置方法,需要的朋友可以參考下2025-04-04
詳解Python如何輕松實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)
這篇文章主要為大家詳細(xì)介紹了Python如何在Windows下不用任務(wù)管理器就實(shí)現(xiàn)輕松定時(shí)執(zhí)行任務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-10-10
Python實(shí)現(xiàn)的各種常見(jiàn)分布算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的各種常見(jiàn)分布算法,結(jié)合實(shí)例形式總結(jié)分析了Python常見(jiàn)的各種分布算法相關(guān)實(shí)現(xiàn)技巧,包括二項(xiàng)分布、離散分布、泊松分布、正態(tài)分布、指數(shù)分布等算法實(shí)現(xiàn)方法,需要的朋友可以參考下2018-12-12

