Mewarisi Model Pydantic
Warisan (inheritance) adalah konsep dasar dalam pemrograman berorientasi objek yang memungkinkan pengembang untuk membuat kelas baru berdasarkan yang sudah ada, dengan cara memperluas dan menggabungkan fungsionalitas. Pada bab ini, saya akan menjelajahi cara mewarisi model Pydantic untuk membuat kode yang lebih efisien dan mudah dipelihara.
Membuat Model Dasar
Pertama-tama, kita perlu membuat model dasar yang menjadi dasar untuk model yang diwarisi. Dalam Pydantic, model didefinisikan dengan menggunakan kelas BaseModel
. Mari kita buat contoh sederhana:
from pydantic import BaseModel, EmailStr
class User(BaseModel):
id: int
name: str
email: EmailStr
Memperluas Model Dasar
Sekarang kita memiliki model dasar User
, kita dapat membuat model baru yang mewarisi darinya. Misalnya, kita ingin membuat model Student
dengan bidang tambahan, seperti enrollment_date
dan major
. Kita dapat mencapai ini dengan memperluas model User
sebagai berikut:
from datetime import date
from typing import Optional
class Student(User):
enrollment_date: date
major: Optional[str] = None
Menambahkan Validator ke Model yang Diwarisi
Validator adalah fungsi yang memvalidasi dan memproses data untuk model Pydantic. Mereka dapat ditambahkan ke model yang diwarisi untuk menegakkan aturan kustom atau memodifikasi data sebelum disimpan dalam model. Untuk menambahkan validator ke model Student
kita, kita menggunakan dekorator @validator
:
from pydantic import validator
class Student(User):
enrollment_date: date
major: Optional[str] = None
@validator("enrollment_date")
def validate_enrollment_date(cls, enrollment_date):
if enrollment_date > date.today():
raise ValueError("Enrollment date must be in the past")
return enrollment_date
Mengganti Bidang dan Metode
Dalam beberapa kasus, kita mungkin ingin mengganti bidang atau metode dalam model yang diwarisi untuk mengubah perilakunya. Untuk melakukan ini, cukup mendefinisikan ulang bidang atau metode dalam kelas turunan:
class Staff(User):
role: str
email: str # Overriding the EmailStr type in the User model
def get_role(self):
return f"Staff role: {self.role}"
Dalam contoh ini, kita mengganti bidang email
agar menerima string apa saja bukan hanya validasi sebagai alamat email. Selain itu, kita menambahkan metode baru get_role
ke kelas Staff
.
Contoh Praktis Warisan Pydantic
Pada bab ini, saya akan menelusuri contoh praktis warisan Pydantic yang menunjukkan kekuatan dan fleksibilitas fitur ini dalam aplikasi dunia nyata.
Otentikasi Pengguna
Misalkan ada aplikasi web yang memiliki jenis pengguna yang berbeda, seperti Admin
, Customer
, dan ContentCreator
. Setiap jenis pengguna dapat memiliki kumpulan atribut dan fungsionalitas unik masing-masing. Dengan memanfaatkan warisan Pydantic, kita dapat membuat model User
dasar dan kemudian memperluasnya untuk setiap jenis pengguna.
# Base User model
class User(BaseModel):
id: int
username: str
password: str
email: EmailStr
# Admin model
class Admin(User):
access_level: int
def grant_permission(self, target_user: User):
# Implementation to grant permission to target_user
# Customer model
class Customer(User):
shipping_address: str
billing_address: str
def place_order(self, order: Order):
# Implementation to place an order
# ContentCreator model
class ContentCreator(User):
bio: Optional[str] = None
def create_content(self, content: Content):
# Implementation to create content
Katalog Produk
Dalam aplikasi e-commerce, kita mungkin memiliki jenis produk yang berbeda, seperti Elektronik
, Clothing
, dan Furniture
. Setiap jenis produk bisa memiliki atribut yang unik. Berikut adalah contoh penggunaan warisan Pydantic untuk memodelkan jenis produk ini:
# Base Product model
class Product(BaseModel):
id: int
name: str
price: float
description: str
# Electronics model
class Electronics(Product):
brand: str
warranty_period: int
# Clothing model
class Clothing(Product):
size: str
material: str
gender: str
# Furniture model
class Furniture(Product):
dimensions: Tuple[float, float, float]
weight: float
material: str
Model Posting Blog
Dalam platform blogging, kita mungkin memiliki berbagai jenis konten, seperti Article
, Video
, dan ImageGallery
. Setiap jenis konten dapat memiliki atribut dan fungsionalitas yang unik. Anda dapat menggunakan warisan Pydantic untuk membuat model untuk jenis konten ini:
# Base Content model
class Content(BaseModel):
id: int
title: str
author: User
created_at: datetime
# Article model
class Article(Content):
body: str
tags: List[str]
# Video model
class Video(Content):
video_url: HttpUrl
duration: int
# ImageGallery model
class ImageGallery(Content):
images: List[HttpUrl]
thumbnail: HttpUrl
Referensi