- vừa được xem lúc

[Django] Model Đa hình trong Django - Polymorphic Model

0 0 23

Người đăng: Cảnh Sát Chính Tả

Theo Viblo Asia

Mở đầu

Trong quá trình phát triển ứng dụng web, chúng ta thường gặp các tình huống mà một đối tượng có thể thuộc vào nhiều kiểu khác nhau. Ví dụ, trong một dự án, người dùng có thể tham gia trực tiếp hoặc thông qua một nhóm. Trong trường hợp như vậy, việc xử lý quan hệ nhiều-nhiều giữa các đối tượng User, Team và Project trở nên phức tạp. Đây là lúc mô hình đa hình trong Django giúp chúng ta giải quyết vấn đề này một cách tự nhiên và hiệu quả.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về cách triển khai mô hình đa hình trong Django thông qua ví dụ về các mô hình Project, User và Team. Chúng ta sẽ khám phá các bước cần thiết để tạo một mô hình đa hình, từ việc tạo migration cho mô hình, đến cách tự động nhận biết kiểu đối tượng và cách thực hiện truy vấn với mô hình đa hình.

Bằng cách áp dụng mô hình đa hình trong Django, chúng ta có thể dễ dàng quản lý và truy vấn dữ liệu liên quan đến các đối tượng khác nhau trong một hệ thống phức tạp. Hãy bắt đầu khám phá cách triển khai mô hình đa hình trong Django và tận dụng sức mạnh của nó trong quá trình phát triển ứng dụng của bạn.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về cách triển khai một mô hình đa hình trong Django, bằng ví dụ về các mô hình Project, User và Team: Một Project có thể có nhiều Team/User cùng tham gia phát triển và ngược lại một Team/User cũng có thể tham gia vào nhiều Project cùng lúc.

Để giải quyết vấn đề này, chúng ta sẽ thực hiện các bước sau:

  • Tạo Migration cho Model Đa hình
  • Tự động nhận biết kiểu đối tượng trong Model Đa hình
  • Thực hiện truy vấn (query) với Model Đa hình

Tạo Migration cho Model Đa hình

Bắt đầu bằng việc tạo các mô hình cho Project, UserTeam trong Django models.py:

from django.db import models class Project(models.Model): name = models.CharField(max_length=255) # Thêm các trường khác của Project class User(models.Model): username = models.CharField(max_length=255) # Thêm các trường khác của User class Team(models.Model): name = models.CharField(max_length=255) # Thêm các trường khác của Team

Sau khi đã định nghĩa các mô hình, chúng ta cần tạo migration để áp dụng các thay đổi vào cơ sở dữ liệu:

$ python manage.py makemigrations
$ python manage.py migrate

Điều này sẽ tạo ra các bảng tương ứng trong cơ sở dữ liệu cho Project, User và Team.

Tự động nhận biết kiểu đối tượng trong Model Đa hình

Để tự động nhận biết kiểu đối tượng trong Model Đa hình, chúng ta sử dụng trường liên quan động (GenericForeignKey) trong Django. Ta sẽ tạo một mô hình ProjectMember để thể hiện quan hệ giữa Project, User và Team:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType class ProjectMember(models.Model): MEMBER_TYPE_CHOICES = ( ('user', 'User'), ('team', 'Team'), ) project = models.ForeignKey(Project, on_delete=models.CASCADE) member_type = models.CharField(max_length=4, choices=MEMBER_TYPE_CHOICES) member_id = models.PositiveIntegerField() content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) content_object = GenericForeignKey('content_type', 'member_id')

Trong đó, member_type được sử dụng để xác định kiểu đối tượng (User hoặc Team), và member_id lưu trữ ID của đối tượng tương ứng. content_typecontent_object là trường liên quan đến kiểu nội dung và đối tượng tương ứng.

Thực hiện truy vấn (query) với Model Đa hình

Để thực hiện truy vấn với Model Đa hình, chúng ta có thể sử dụng các phương thức và truy vấn quen thuộc của Django ORM. Dưới đây là một số ví dụ về cách truy vấn dữ liệu từ Model Đa hình:

1. Lấy danh sách các User trong một Project cụ thể:

users = User.objects.filter(projectmember__project=my_project)

Trong đó, my_project là đối tượng Project cụ thể mà chúng ta muốn lấy danh sách các User.

2. Lấy danh sách các Project mà một User cụ thể tham gia:

projects = Project.objects.filter(projectmember__member_type='user', projectmember__member_id=my_user.id)

Trong đó, my_user là đối tượng User cụ thể mà chúng ta muốn lấy danh sách các Project.

3. Lấy danh sách các Team trong một Project cụ thể:

teams = Team.objects.filter(projectmember__project=my_project, projectmember__member_type='team')

Trong đó, my_project là đối tượng Project cụ thể mà chúng ta muốn lấy danh sách các Team.

4. Lấy danh sách các thành viên (User hoặc Team) của một Project cụ thể:

members = ProjectMember.objects.filter(project=my_project)

Trong đó, my_project là đối tượng Project cụ thể mà chúng ta muốn lấy danh sách các thành viên.

Như vậy, chúng ta đã tổng hợp các bước cần thiết để triển khai một Model Đa hình trong Django. Bằng cách sử dụng trường liên quan động và các truy vấn thông thường của Django ORM, chúng ta có thể quản lý và truy vấn dữ liệu từ các đối tượng khác nhau trong một mô hình đa hình.

Lời kết

Hi vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về cách triển khai Model Đa hình trong Django và cách thực hiện truy vấn với nó. Model Đa hình là một khái niệm quan trọng trong lập trình, cho phép bạn xử lý các tình huống phức tạp khi một đối tượng có thể thuộc nhiều loại khác nhau. Với ví dụ về các mô hình Project, User và Team, bạn đã được trình bày cách tạo migration, tự động nhận biết loại đối tượng và thực hiện truy vấn.

Khi áp dụng Model Đa hình vào dự án của bạn, hãy chắc chắn hiểu rõ yêu cầu của mô hình và đảm bảo áp dụng đúng cấu trúc và quy tắc quan hệ giữa các model. Điều này sẽ giúp bạn xây dựng hệ thống linh hoạt và dễ dàng mở rộng trong tương lai.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hiệp phương sai và hệ số tương quan tuyến tính trong Python

Giới thiệu. Làm việc với các biến trong phân tích dữ liệu luôn đặt ra câu hỏi: Các biến phụ thuộc, liên kết và thay đổi với nhau như thế nào? Các biện pháp hiệp phương sai và hệ số tương quan tuyến tính giúp thiết lập điều này.

0 0 68

- vừa được xem lúc

Không gian tên(namspace) và phạm vi(scope) trong Python

. Khi mình ngồi học và dịch bài "Class trong Python" cho sê-ri "Khám Phá Đại Bản Doanh Python", mình đã đụng hai bạn này, và các bạn thật là trừu tượng và khó gặm. Thế là mình tìm kiếm và viết bài này để hiểu rõ hơn về hai bạn ấy, hi vọng bạn đọc thêm để hiểu về Python nhé.

0 0 49

- vừa được xem lúc

Tản mạn một chút về kỹ thuật Streaming

Lời mở đầu. Hôm nay trong lúc rảnh rỗi tôi ngồi tìm hiểu kỹ thuật streaming và áp dụng nó bằng Python. Bài viết có thể có thiếu sót mong các bạn thông cảm. Stream là một kỹ thuật chuyển dữ liệu theo dòng ổn định và liên tục.

0 0 74

- vừa được xem lúc

Vì sao chọn FastAPI

Introduction. Gần đây, do nhu cầu phát triển theo mô hình microservice ngày càng phổ biến, mình chủ yếu code mảng Python - Backend nên được phép chọn một framework để phát triển project mới cho công ty, sau khi cân nhắc giữa 3 framework phổ biến hiện tại sử dụng Python là Django, Flask và FastAPI, m

0 0 44

- vừa được xem lúc

Introduction to Google Cloud AutoML Vision

With the rapid development of technology, a Data Scientist could achieve their job like training ML models faster. The Word "AutoML"(also known as Automated machine learning) comes and now plays a cru

0 0 83

- vừa được xem lúc

Telegram Bot - Cào Dữ Liệu Từ VnExpress Bằng Python

Chào mọi người, sau bao ngày với các bài viết về lỗi bảo mật thì hôm nay mình sẽ đổi gió tí nhỉ :v. Vì thế nên hôm nay mình sẽ hướng dẫn mọi người làm 1 con bot Telegram bằng Python nhé.

1 0 223