Bendera each_item pada Validator Pydantic
Bendera each_item
adalah fitur pada validator Pydantic yang, jika diatur sebagai True
, memungkinkan validator untuk menerapkan aturan validasi yang telah ditentukan pada setiap item dalam iterable (seperti list, dictionary) pada data masukan.
Implementasi bendera each_item
Untuk menggunakan bendera each_item
, impor decorator validator
dari pustaka Pydantic, definisikan fungsi validasi, dan set each_item=True
. Fungsi validasi harus menerima nama field, nilai field, dan nilai dari instance model, dan mengembalikan nilai yang telah divalidasi atau menimbulkan error validasi jika masukan tidak memenuhi kriteria yang telah ditentukan.
Berikut adalah contoh implementasinya:
from pydantic import BaseModel, validator
class PositiveNumberList(BaseModel):
numbers: List[int]
@validator('numbers', each_item=True)
def validate_positive(cls, item):
if item < 0:
raise ValueError('Item must be a positive integer')
return item
Pada contoh ini, kita telah menentukan model PositiveNumberList
dengan field numbers
yang mengharapkan sebuah list berisi bilangan bulat. Kita juga telah membuat validator untuk field numbers
yang memeriksa setiap item untuk memastikan bahwa itu adalah bilangan bulat positif. Dengan mengatur each_item=True
, validator akan menerapkan fungsi validate_positive
pada setiap item dalam list.
Kesalahan Umum dan Solusinya
Ketika menggunakan bendera each_item
, sangat penting untuk diingat bahwa validator akan diterapkan pada setiap item dalam iterable. Salah satu kesalahan umum adalah menerapkan logika validasi pada iterable secara keseluruhan daripada pada setiap item. Untuk menghindari hal ini, pastikan bahwa logika validasi dalam fungsi dirancang untuk beroperasi pada setiap item.
Misalnya, pertimbangkan implementasi yang salah berikut ini:
from pydantic import BaseModel, validator
class IncorrectPositiveNumberList(BaseModel):
numbers: List[int]
@validator('numbers', each_item=True)
def validate_positive(cls, numbers):
for number in numbers:
if number < 0:
raise ValueError('All items must be positive integers')
return numbers
Dalam kasus ini, fungsi validator validate_positive
salah looping melalui iterable numbers
dalam fungsi, sementara bendera each_item=True
sudah menerapkan fungsi pada setiap item. Hal ini akan menghasilkan TypeError
karena fungsi mengharapkan integer tetapi menerima sebuah list.
Untuk memperbaikinya, ubah fungsi untuk beroperasi pada setiap item:
from pydantic import BaseModel, validator
class CorrectPositiveNumberList(BaseModel):
numbers: List[int]
@validator('numbers', each_item=True)
def validate_positive(cls, number):
if number < 0:
raise ValueError('Item must be a positive integer')
return number
Sekarang, fungsi validate_positive
benar-benar beroperasi pada setiap item dalam list numbers
, memastikan bahwa setiap bilangan adalah bilangan bulat positif.
Referensi