Traffine I/O

Bahasa Indonesia

2023-03-11

Cara Memvalidasi Bahwa Salah Satu dari Dua Bidang Opsional Tidak Null di Pydantic

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.

python
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.

python
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:

python
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:

python
example = Example(field1=None, field2=None)

Ini akan menimbulkan ValueError dengan pesan bahwa field1 atau field2 tidak boleh bernilai None.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!