Mengkonversi Model Pydantic Menjadi Kamus
Salah satu fitur utama dari Pydantic adalah kemampuannya untuk mengkonversi model ke tipe data Python native, seperti kamus. Proses ini mudah dilakukan dan dapat disesuaikan sesuai kebutuhan. Cara utama untuk mencapai konversi ini adalah dengan menggunakan metode .dict()
yang tersedia pada setiap instance model Pydantic.
Menggunakan Metode .dict()
Metode .dict()
adalah fungsi bawaan pada model Pydantic yang mengembalikan representasi kamus dari model. Metode ini mengiterasi melalui field-model dan membuat kamus di mana kunci sesuai dengan nama field dan nilai sesuai dengan nilai field.
Pertimbangkan model Pydantic berikut:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
email: str
Anda dapat membuat instance dari model ini dan mengonversinya menjadi kamus sebagai berikut:
user = User(name='John Doe', age=30, email='john.doe@example.com')
user_dict = user.dict()
print(user_dict)
Keluarannya adalah sebuah kamus:
{'name': 'John Doe', 'age': 30, 'email': 'john.doe@example.com'}
Menyesuaikan Konversi
Metode .dict()
menyediakan beberapa parameter yang memungkinkan Anda menyesuaikan kamus hasil konversi. Di sini, kita akan membahas setiap parameter ini dan memberikan beberapa contoh.
include
Parameter ini memungkinkan Anda untuk menentukan satu set field yang akan disertakan dalam output. Semua field lainnya akan dikecualikan. Field-field tersebut diberikan sebagai string dalam sebuah set.
user_dict = user.dict(include={"name", "email"})
print(user_dict)
{'name': 'John Doe', 'email': 'john.doe@example.com'}
exclude
Parameter exclude
memungkinkan Anda untuk menentukan satu set field yang akan dikecualikan dari output. Semua field lainnya akan disertakan. Seperti include
, field-field tersebut diberikan sebagai string dalam sebuah set.
user_dict = user.dict(exclude={"email"})
print(user_dict)
{'name': 'John Doe', 'age': 30}
by_alias
Jika diset ke True
, parameter by_alias
menyebabkan kamus keluaran menggunakan alias field (jika didefinisikan) daripada nama field. Ini berguna ketika Anda ingin kunci kamus cocok dengan representasi eksternal model, misalnya saat menghasilkan respons API.
from pydantic import BaseModel, Field
class User(BaseModel):
name: str = Field(alias='username')
age: int
email: str
user = User(username='John Doe', age=30, email='john.doe@example.com')
user_dict = user.dict(by_alias=True)
print(user_dict)
{'username': 'John Doe', 'age': 30, 'email': 'john.doe@example.com'}
exclude_unset
Jika exclude_unset
diatur ke True
, kamus keluaran tidak akan mencakup field yang tidak ditetapkan secara eksplisit saat membuat instance model. Ini berguna ketika Anda ingin menghasilkan kamus "sparse" yang hanya mencakup field yang telah ditugaskan secara eksplisit.
user = User(name='John Doe')
user_dict = user.dict(exclude_unset=True)
print(user_dict)
{'name': 'John Doe'}
exclude_defaults
Mengatur exclude_defaults
ke True
berarti field-field yang saat ini sama dengan nilai default mereka akan dikecualikan dari output. Ini berguna jika Anda ingin membuat kamus yang hanya mencakup field-field yang ditugaskan secara eksplisit ke nilai non-default.
class User(BaseModel):
name: str = 'Default Name'
age: int = 0
email: str = 'default@example.com'
user = User(name='John Doe', age=30, email='john.doe@example.com')
user_dict = user.dict(exclude_defaults=True)
print(user_dict)
{'name': 'John Doe', 'age': 30, 'email': 'john.doe@example.com'}
exclude_none
Jika exclude_none
diatur ke True
, setiap field dengan nilai None
akan dikecualikan dari output. Ini berguna ketika Anda ingin mengabaikan field-field yang dapat bernilai null dan belum ditetapkan.
user = User(name='John Doe', age=None)
user_dict = user.dict(exclude_none=True)
print(user_dict)
{'name': 'John Doe'}
Mengkonversi Kamus Menjadi Model Pydantic
Meskipun model Pydantic menawarkan cara yang nyaman untuk menangani dan memvalidasi data, seringkali akan ada waktu ketika data diterima sebagai kamus, terutama saat menangani data JSON dari API atau data dari pustaka Python lainnya. Dalam hal ini, kita dapat memanfaatkan kemampuan parsing data Pydantic untuk mengonversi kamus menjadi model Pydantic.
Menggunakan Konstruktor Model Pydantic
Salah satu cara paling mudah untuk mengonversi kamus menjadi model Pydantic adalah dengan menggunakan konstruktor model tersebut. Kunci dalam kamus harus sesuai dengan atribut yang didefinisikan dalam model Pydantic.
Menggunakan model User
yang didefinisikan di bab sebelumnya, mari buat sebuah kamus dan mengonversinya menjadi model Pydantic:
user_dict = {'name': 'John Doe', 'age': 30, 'email': 'john.doe@example.com'}
# Convert dictionary to Pydantic model
user = User(**user_dict)
print(user)
Keluarannya akan menjadi model Pydantic:
User(name='John Doe', age=30, email='john.doe@example.com')
Perhatikan penggunaan **
sebelum user_dict
di konstruktor model. Operator ini dikenal sebagai operator unpacking kamus, yang mengirimkan kunci dan nilai dalam kamus sebagai argumen kata kunci ke fungsi.
Menangani Kesalahan Validasi
Fitur utama dari model Pydantic adalah kemampuannya dalam memvalidasi data. Saat membuat model Pydantic dari sebuah kamus, Pydantic memvalidasi data terhadap petunjuk tipe model. Jika data tidak sesuai dengan tipe yang diharapkan atau tidak lolos validasi kustom lainnya, Pydantic akan memunculkan ValidationError
.
Misalnya, mari coba membuat model User
dengan tipe data yang salah:
incorrect_user_dict = {'name': 'John Doe', 'age': '30', 'email': 'john.doe@example.com'}
try:
user = User(**incorrect_user_dict)
except ValidationError as e:
print(e)
Dalam hal ini, Pydantic akan memunculkan ValidationError
yang mengindikasikan bahwa field age
harus berupa integer:
1 validation error for User
age
value is not a valid integer (type=type_error.integer)
Pesan kesalahan ini memberi tahu Anda dengan jelas apa yang salah, memungkinkan Anda menangani kesalahan validasi data dengan efektif dalam kode Anda.