欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pydantic中model_validator的實(shí)現(xiàn)

 更新時(shí)間:2025年04月09日 10:47:31   作者:吉小雨  
本文主要介紹了Pydantic中model_validator的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引言

在 Pydantic 中,除了可以使用 field_validator 裝飾器對單個(gè)字段進(jìn)行驗(yàn)證外,還可以使用 model_validator 裝飾器對整個(gè)模型進(jìn)行驗(yàn)證。model_validator 允許您在字段級驗(yàn)證之后,對模型的整個(gè)數(shù)據(jù)進(jìn)行額外的驗(yàn)證。在本教程中,我們將探討如何使用 model_validator 裝飾器來創(chuàng)建自定義的模型驗(yàn)證邏輯。

基礎(chǔ)知識

在開始之前,請確保您已經(jīng)安裝了 Pydantic。如果沒有,請使用以下命令安裝:

pip install pydantic

創(chuàng)建 Pydantic 模型

首先,讓我們創(chuàng)建一個(gè)簡單的 Pydantic 模型。這個(gè)模型將包含兩個(gè)字段:a 和 b。

from pydantic import BaseModel
class Model(BaseModel):
    a: str
    b: int

使用 model_validator 裝飾器

model_validator 裝飾器允許您為模型添加自定義驗(yàn)證邏輯。要使用它,請按照以下步驟操作:

導(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īng)用于驗(yàn)證函數(shù)。

4. 測試模型: 創(chuàng)建模型實(shí)例并測試驗(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。

高級用法

model_validator 裝飾器還支持一些高級功能,如:

自定義驗(yàn)證模式: 通過設(shè)置 mode 參數(shù),可以指定驗(yàn)證是在字段驗(yàn)證前還是驗(yàn)證后進(jìn)行。

@model_validator(mode='before')

檢查字段存在性: 通過設(shè)置 check_fields 參數(shù),可以控制是否檢查字段是否實(shí)際存在于模型中。

@model_validator(check_fields=False)

model_validator 裝飾器源碼

以下是 model_validator 裝飾器的簡化版源碼:

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)用對象 f 作為參數(shù),并返回一個(gè) _decorators.PydanticDescriptorProxy 對象。
  • 代碼首先檢查 f 是否是實(shí)例方法。如果是,拋出 PydanticUserError,因?yàn)?nbsp;model_validator 不能應(yīng)用于實(shí)例方法。
  • 然后,確保 f 是一個(gè)類方法。
  • 創(chuàng)建一個(gè)包含模式和字段檢查標(biāo)志的 _decorators.ModelValidatorDecoratorInfo 對象。
  • 最后,返回一個(gè) _decorators.PydanticDescriptorProxy 對象,它包裝了原始的函數(shù) f 和模型驗(yàn)證信息。

返回 dec:

model_validator 函數(shù)返回 dec 函數(shù),它將作為裝飾器應(yīng)用于驗(yàn)證函數(shù)。

結(jié)論

在本教程中,我們學(xué)習(xí)了如何使用 Pydantic 的 model_validator 裝飾器來為模型添加自定義驗(yàn)證邏輯。通過這個(gè)強(qiáng)大的工具,您可以對整個(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論