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.
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: Customer và Seller. 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 Customer và Seller như sau:
class Customer(UserInfo): customer_id = models.IntegerField() class Seller(UserInfo): seller_id = models.IntegerField()
Trong đoạn code tên, model Customer và Seller 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.
Ở 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)
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.
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.
You should read it
- How to put Django app into maintenance mode
- How to Install and Configure PostgreSQL in Django
- How to use AWS S3 Bucket to store static and media files in Django
- Calculate inheritance in C #
- How to build an authentication system in Django using OAuth
- Multiple Inheritance in Python
- How to Add Search to a Django App
- How to upload photos using Django app
- How to override default template in django-allauth
- How to Create a CRUD App with Django's Class Based Viewers
- How to Implement ChatGPT in Django
- Using Django API is easy with built-in templates
Maybe you are interested
Series of DrayTek router models have security holes
Pixel 9's new AI features could soon expand to older models
Why should you buy the base iPhone 16 instead of the Pro model?
Top 6 smart ring models today
Why is the Working hybrid model being adopted by more and more companies?
Microsoft Phi-3.5 launched: A more competitive AI model