Traffine I/O

Bahasa Indonesia

2023-03-12

Mengkonversi Antara Model Pydantic dan Kamus

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:

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

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

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

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

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

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

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

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

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

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

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!