Model Inheritance là gì trong Django?

Inheritance - Kế thừa cho phép bạn dùng lại code và tạo mẫu dữ liệu gọn gàng hơn. Thế nhưng Django cung cấp nhiều hơn một cách để kế thừa, vì thế, đảm bảo bạn biết rõ các điểm khác biệt.

Kế thừa model trong Django

Model inheritance là một tính năng ORM của Django, cho phép lập trình viên tạo mối quan hệ phân cấp giữa các mẫu database. Nó cho phép tái sử dụng code, có thể mở rộng và một codebase gọn gàng bằng cách nâng cấp các quy tắc của chương trình hướng đối tượng.

Dù bạn đang xây dưng một app web phức tạp hay làm việc trên dự án nhỏ hơn, model inheritance có thể cung cấp những lợi ích đáng kể, như giảm dư thừa và đảm bảo hành vi nhất quán.

Các kiểu model inheritance trong Django

Django cung cấp hỗ trợ 3 kiểu model inheritance:

  • Abstract Base Class.
  • Multi-table Inheritance.
  • Proxy Model.

Mỗi kiểu model inheritance lại có lợi ích riêng và bạn sẽ dùng chúng cho mục tiêu cụ thể.

Abstract Base Class

Abstract Base Class - Các lớp cơ sở trừu tượng cung cấp một cách để xác định trường và phương thức chung mà nhiều mô hình có thể kế thừa. Ví dụ: nếu bạn có hai mô hình chia sẻ các trường tương tự nhau, bạn có thể sử dụng lớp cơ sở trừu tượng để xác định trường tương tự. Ví dụ:

class Customer(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    customer_id = models.IntegerField() 

class Seller(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    seller_id = models.IntegerField()

Đoạn code trên xác định hai model Django: CustomerSeller. Hai model này chia sẻ hai trường phổ biến, đó là name và email. Để tránh sự dư thừa này, bạn có thể tạo một mô hình riêng biệt để chứa các trường chung trong mô hình Khách hàng và Người bán, đồng thời làm cho nó trở nên trừu tượng.

class UserInfo(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

    class Meta:
        abstract = True

Đoạn code trên xác định một mẫu mới và đặt thuộc tính abstract sang True. Điều này có nghĩa model đó sẽ ở trạng thái trừu tượng. Django sẽ không tạo bảng trong database.

Bạn có thể viết lại model CustomerSeller như sau:

class Customer(UserInfo):
    customer_id = models.IntegerField() 

class Seller(UserInfo):
    seller_id = models.IntegerField()

Trong đoạn code tên, model CustomerSeller kế thừa model UserInfo thay cho models.Model.

Bạn có thể xem model trong bảng admin bằng cách đăng ký chúng trong file admin.py như thế này:

from .models import Customer, Seller

admin.site.register(Customer)
admin.site.register(Seller)

Chuyển các chế độ của bạn và bắt đầu server lập trình bằng cách chạy phần sau trên dòng lệnh:

python manage.py makemigrations \
    && python manage.py migrate \
    && python manage.py runserver

Điều hướng tới trang admin và đăng nhập bằng thông tin chi tiết về superuser. Bạn sẽ thấy tất cả 3 trường trong mỗi model.

Bảng admin Django

Ở ví dụ này, Django đã tạo một bảng cho model Customer và Seller. Bạn có thể thấy model UserInfo không có bảng vì nó trừu tượng.

Multi-Table Inheritance

Bạn có thể sử dụng kế thừa nhiều bảng khi mô hình mẹ cũng cần tồn tại dưới dạng một bảng trong cơ sở dữ liệu cùng với mô hình con.

Không giống như kế thừa lớp cơ sở trừu tượng, trong đó mô hình mẹ sẽ không phải là một bảng trong cơ sở dữ liệu, kế thừa nhiều bảng tạo ra một bảng cho mô hình mẹ.

Trong kế thừa nhiều bảng, mô hình con kế thừa tất cả các trường và phương thức từ mô hình mẹ của nó và thêm các trường cụ thể. Khóa ngoại giúp thiết lập mối quan hệ mô hình giữa các mô hình cha và con.

Ví dụ:

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def get_name(self):
        return f"{self.first_name} {self.last_name}"

    class Meta:
        abstract = True

class Employee(Person):
    employee_id = models.CharField(max_length=20)
    department = models.CharField(max_length=100)
    salary = models.FloatField()
    dob = models.DateField()

class Manager(Employee):
    title = models.CharField(max_length=100)

Django kế thừa mẫu

Proxy model

Mô hình proxy giúp bạn tạo mô hình mới mở rộng từ mô hình hiện có mà không cần tạo bảng cơ sở dữ liệu mới. Trong kiểu kế thừa mô hình này, mô hình proxy và mô hình gốc sẽ chia sẻ cùng một bảng. Sử dụng các mô hình proxy, bạn có thể thực hiện những việc như tạo mô hình tùy chỉnh và thay đổi trình quản lý mặc định.

Bạn có thể tạo một proxy model bằng cách thêm proxy=True trong clas Meta. Ví dụ:

class ProxyModel(BaseModel):

    class Meta:
        proxy = True

Cách sử dụng điển hình của mô hình proxy là khi mô hình cơ sở tồn tại và cần phải tạo một phiên bản chuyên biệt của nó cùng các chức năng bổ sung. Đây là một ví dụ cơ bản:

class Post(models.Model):
    title = models.CharField(max_length=30)
    author = models.CharField(max_length=30)

    def __str__(self):
        return self.title

class ProxyPost(Post):

    class Meta:
        proxy = True

Đoạn code này xác định hai model: Post và MyPost. Model Post xác định hai trường cho tiêu đề và tác giả. Model Proxy kế thừa từ model Post.

Di chuyển các model trên và thêm post mới vào bảng được tạo cho model Post đó.

Sau khi thêm post, mở bảng Proxy posts. Bạn sẽ thấy post đã thêm vào bảng Post ở bên trong nó.

Những thay đổi bạn thực hiện đối với bài đăng trong bảng Proxy posts sẽ ảnh hưởng đến bài đăng tương ứng trong bảng Post và ngược lại. Điều này chứng tỏ chúng thật sự ngồi chung một bảng.

Bạn có thể chỉnh sửa phương thức str() của model proxy:

class ProxyPost(Post):

    class Meta:
        proxy = True
        ordering = ["title"]

    def __str__(self):
        return self.author

Với chỉnh sửa này, một đại diện chuỗi của ProxyPost sẽ là tác giả (author), không phải tiêu đề. Thứ tự của mô hình proxy cũng sẽ theo tiêu đề thay vì trường ID mặc định.

Proxy Model

Trên đây là những điều bạn cần biết về Model Inheritance trong Django. Hi vọng bài viết hữu ích với các bạn.

Thứ Năm, 20/07/2023 14:45
53 👨 200
0 Bình luận
Sắp xếp theo