はじめに
この記事では、Pydanticを使用して、2つのオプションフィールドのうちどちらかがNone
でないことを検証する方法を紹介します。
Field1 または Field2 が None でないことを検証
まず、2つのオプションフィールドのうちどちらかがNone
でないことを検証するために、これらのフィールドを持つPydanticモデルを準備します。この例では、2つのオプション文字列フィールドfield1
とfield2
を持つExample
モデルを作成します。
from typing import Optional
from pydantic import BaseModel
class Example(BaseModel):
field1: Optional[str] = None
field2: Optional[str] = None
ここでは、typing
モジュールからOptional
型をインポートして、オプションフィールドを定義することができます。また、pydantic
モジュールからBaseModel
クラスをインポートして、モデルを作成するために使用します。
Example
クラスでは、2つのオプション文字列フィールドfield1
とfield2
を定義しています。デフォルト値をNone
に設定しているため、これらのフィールドはオプションであり、値が提供されていない場合はNone
であることができます。
field1
またはfield2
のどちらかがNone
でないことを検証するには、Pydanticのvalidator
デコレータを使用します。このデコレータを使用すると、フィールドまたはフィールドのセットのカスタム検証ロジックを定義できます。
Example
クラスでは、validator
メソッドとしてcheck_either_not_none
を定義し、2つの引数v
とvalues
を受け取ります。v
引数は検証されているフィールド (field1
またはfield2
) の値を表し、values
引数は検証されている全ての値の辞書を表します。
from typing import Optional, Any
from pydantic import BaseModel, validator
class Example(BaseModel):
field1: Optional[str] = None
field2: Optional[str] = None
@validator('field1', 'field2', pre=True)
def check_either_not_none(cls, v: Optional[str], values: dict, **kwargs: Any) -> Optional[str]:
if not kwargs.get("validate_assignment"):
return v
if v is None and values.get('field2') is None:
raise ValueError('either field1 or field2 must not be None')
return v
ここでは、validator
デコレータでcheck_either_not_none
メソッドを修飾し、検証するフィールドの名前 (field1
およびfield2
) を文字列で渡します。
メソッド内では、まず検証されているフィールド (v
) の値がNone
かどうかをチェックします。もしNone
であれば、values.get('field2')
を使用して他のフィールド (field2
) の値がNone
かどうかをチェックします。両方のフィールドがNone
の場合は、ValueError
をスローし、少なくとも1つのフィールドがNone
であってはならないことを示すメッセージを表示します。
フィールドのいずれかがNone
でない場合は、検証されているフィールド (v
) の値を返します。
この検証ロジックが定義された状態で、Example
モデルのインスタンスを作成し、検証をテストすることができます。
example = Example(field1='hello', field2=None)
この例では、field1
には'hello'
が設定され、field2
にはNone
が設定されています。field1
がNone
でないため、検証に合格し、エラーなしでExample
モデルのインスタンスを作成することができます。
両方のフィールドがNone
に設定されたインスタンスを作成しようとした場合、ValueError
が発生します。
example = Example(field1=None, field2=None)
この場合、field1
またはfield2
のどちらかがNone
である必要があるため、ValueError
が発生します。