Pengenalan
Artikel ini akan memperkenalkan cara menggunakan Pydantic untuk memvalidasi bahwa salah satu dari dua bidang opsional tidak berisi None
.
Memvalidasi bahwa Salah Satu dari Field1 atau Field2 Tidak Bernilai None
Sebelum kita dapat mulai memvalidasi bahwa salah satu dari dua bidang opsional tidak berisi None
, kita perlu menyiapkan model Pydantic dengan bidang-bidang ini. Dalam contoh ini, kita akan membuat model Example
dengan dua bidang string opsional: field1
dan field2
.
from typing import Optional
from pydantic import BaseModel
class Example(BaseModel):
field1: Optional[str] = None
field2: Optional[str] = None
Di sini, kita mengimpor tipe Optional
dari modul typing
, yang memungkinkan kita untuk mendefinisikan bidang opsional. Kita juga mengimpor kelas BaseModel
dari modul pydantic
, yang akan kita gunakan untuk membuat model kita.
Dalam kelas Example
, kita mendefinisikan dua bidang string opsional: field1
dan field2
. Kita mengatur nilai defaultnya menjadi None
, yang berarti mereka opsional dan dapat berisi None
jika tidak ada nilai yang disediakan.
Untuk memvalidasi bahwa field1
atau field2
tidak bernilai None
, kita akan menggunakan dekorator validator
di Pydantic. Dekorator ini memungkinkan kita untuk mendefinisikan logika validasi khusus untuk satu bidang atau set bidang.
Di kelas Example
kita akan mendefinisikan metode validator
yang disebut check_either_not_none
yang mengambil dua argumen: v
dan values
. Argumen v
mewakili nilai dari bidang yang divalidasi (field1
atau field2
), sedangkan argumen values
mewakili kamus dari semua nilai yang sedang divalidasi.
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
Di sini, kita mendekorasi metode check_either_not_none
dengan dekorator validator dan meneruskan nama bidang yang ingin kita validasi (field1
dan field2
) sebagai string.
Dalam metode ini, pertama-tama kita memeriksa apakah nilai dari bidang yang divalidasi (v
) adalah None
. Jika itu, maka kita kemudian memeriksa apakah nilai bidang lainnya (field2
) juga None
menggunakan values.get('field2')
. Jika kedua bidang tersebut adalah None
, kita akan menimbulkan ValueError
dengan pesan yang menunjukkan bahwa setidaknya salah satu bidang tidak boleh bernilai None
.
Jika salah satu bidang tidak bernilai None
, kita hanya mengembalikan nilai dari bidang yang sedang divalasi (v
).
Dengan logika validasi ini, sekarang kita dapat membuat instance dari model Example
dan menguji validasi kita:
example = Example(field1='hello', field2=None)
Dalam contoh ini, field1
diatur menjadi 'hello'
dan field2
diatur menjadi None
. Karena field1
tidak None
, validasi kita berhasil dan kita dapat membuat instance model Example
tanpa kesalahan.
Jika kita mencoba membuat instance dengan kedua bidang diatur menjadi None
, kita akan mendapatkan ValueError
:
example = Example(field1=None, field2=None)
Ini akan menimbulkan ValueError
dengan pesan bahwa field1
atau field2
tidak boleh bernilai None
.