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 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
May be interested
- How to Implement ChatGPT in Djangointegrating chatgpt into your django application allows you to create dynamic and interactive chat interfaces. here are detailed instructions on how to integrate chatgpt into django apps.
- Using Django API is easy with built-in templatesyou can easily use simple apis without configuring an external frontend. here's how to use django templates for api programming.
- Should Django be hosted on PythonAnywhere?pythonanywhere is suitable for django development but is it easy to set up? let's find out together!
- Hướng dẫn tạo mạng Lan trong Half Lifenếu bạn muốn chơi game half life cùng bạn bè thì thông qua các máy ở gần nhau thì chỉ cần tạo mạng lan trong half life để có thể chơi cùng bạn bè trong mạng. cùng theo dõi hướng dẫn sau đây để biết cách tạo mạng lan trong half life, chơi cùng bạn bè nhé.
- Scope in AngularJSscope is a special javascript object with the role of linking controllers and views. scope contains information as model data. in the controller, model data can be accessed via the $ scope object.
- Inheritance (Inheritance) in Pythoninheriting in object-oriented programming allows us to declare new classes to re-use the parent class's functions and attributes and extra functions. in this article, we will learn how to use legacy in python.
- How to create a movie ticket booking system using Djangoprogramming a movie ticket booking system using django is not difficult. below is a detailed step-by-step guide on how to book movie tickets using django.
- iOS 15 allows relatives to inherit data and helps you recover Apple ID passwordapple has just officially introduced ios 15 at the wwdc 2021 event. currently, the beta version of ios 15 has been released to qualified ios app developers.
- How to build CRUD REST API using class-based viewer in Django REST frameworkfollowing the step-by-step instructions below, you will grasp the core of a crud api to develop your programming skills with django.
- Interface in C #an interface is defined as a contract with syntactical contract that all interface inheritance classes should follow. interface defines what part of the covenant and inheritance classes define which part of the covenant.