Traffine I/O

Bahasa Indonesia

2023-03-10

Mewarisi Model Pydantic

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:

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

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

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

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

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

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

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

https://docs.pydantic.dev/usage/models/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!