Panduan Lengkap Menggunakan Pydantic: Data Validation Made Easy
Pydantic adalah library Python yang powerful untuk data validation dan settings management menggunakan Python type hints. Library ini sangat populer di ekosistem Python modern, terutama digunakan oleh FastAPI, dan menjadi standar de-facto untuk validasi data.
Dalam tutorial ini, kita akan mempelajari Pydantic dari dasar hingga advanced usage dengan contoh praktis.
Mengapa Pydantic?
Keunggulan Pydantic:
Instalasi
Install Pydantic v2 (Latest)
# Install Pydantic v2
pip install pydantic
Install dengan email validation
pip install "pydantic[email]"
Install dengan dotenv support
pip install "pydantic-settings"
Verifikasi Instalasi
import pydantic
print(f"Pydantic version: {pydantic.version}")
Should print 2.x.x
Basic Usage: Model Pertama Anda
1. Simple Model
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
age: int
Create instance
user = User(id=1, name="Ruby", email="ruby@rubythalib.ai", age=25)
print(user)
Output: id=1 name='Ruby' email='ruby@rubythalib.ai' age=25
print(user.modeldump())
Output: {'id': 1, 'name': 'Ruby', 'email': 'ruby@rubythalib.ai', 'age': 25}
2. Automatic Type Conversion
Pydantic otomatis convert tipe data yang compatible:
from pydantic import BaseModel
class Product(BaseModel):
id: int
name: str
price: float
instock: bool
String akan di-convert ke int dan float
product = Product(
id="123", # String -> int
name="Laptop",
price="15000000", # String -> float
instock="yes" # String -> bool
)
print(product.id, type(product.id))
Output: 123
print(product.price, type(product.price))
Output: 15000000.0
print(product.instock, type(product.instock))
Output: True
3. Validation Errors
from pydantic import BaseModel, ValidationError
class User(BaseModel):
id: int
name: str
age: int
try:
user = User(id="notanumber", name="Ruby", age=25)
except ValidationError as e:
print(e)
# Akan print error detail tentang invalid id
Output:
1 validation error for User
id
Input should be a valid integer, unable to parse string as an integer [type=intparsing, inputvalue='notanumber', inputtype=str]
Field Types dan Constraints
1. Optional Fields
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: Optional[str] = None # Optional dengan default None
phone: str | None = None # Python 3.10+ syntax
user1 = User(id=1, name="Ruby")
print(user1.email) # None
user2 = User(id=2, name="Ahmad", email="ahmad@example.com")
print(user2.email) # ahmad@example.com
2. Default Values
from pydantic import BaseModel
class Product(BaseModel):
id: int
name: str
price: float = 0.0
category: str = "General"
instock: bool = True
product = Product(id=1, name="Notebook")
print(product.modeldump())
{'id': 1, 'name': 'Notebook', 'price': 0.0, 'category': 'General', 'instock': True}
3. Field dengan Constraints
from pydantic import BaseModel, Field
class User(BaseModel):