Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Django ORM trong Python
Django ORM là một công cụ tốt trong Django framework, cho phép các nhà phát triển tương tác với cơ sở dữ liệu quan hệ thông qua lập trình hướng đối tượng. Với Django ORM, việc quản lý dữ liệu trở nên dễ dàng và hiệu quả hơn, giúp loại bỏ sự phức tạp của việc viết các câu lệnh SQL thủ công. Django ORM không chỉ hỗ trợ nhiều loại cơ sở dữ liệu như PostgreSQL, MySQL, Oracle và SQLite mà còn tự động tạo ra các trang quản trị để quản lý dữ liệu một cách trực quan.
![banquyen png](https://freetuts.net/public/banquyen.png)
Trong bài viết này, mình sẽ tìm hiểu cách sử dụng Django ORM để thiết lập một dự án cơ bản, định nghĩa các mô hình (model), và thực hiện các thao tác cơ bản như tạo, đọc, cập nhật và xóa dữ liệu. Hãy cùng bắt đầu để thấy được sự tiện lợi của Django ORM trong phát triển ứng dụng web.
Bạn có thể tải dự án Django ORM trong Python xuống tại đây.
Django ORM là gì?
ORM là viết tắt của Object-Relational Mapping (mapping đối tượng-quan hệ). ORM là một kỹ thuật cho phép bạn thao tác dữ liệu trong cơ sở dữ liệu quan hệ bằng cách sử dụng lập trình hướng đối tượng.
Bài viết này được đăng tại [free tuts .net]
Django ORM cho phép bạn sử dụng cùng một API Python để tương tác với các cơ sở dữ liệu quan hệ khác nhau bao gồm PostgreSQL, MySQL, Oracle và SQLite. Xem danh sách đầy đủ các cơ sở dữ liệu được hỗ trợ tại đây.
Django ORM sử dụng mô hình active record:
- Một lớp ánh xạ tới một bảng duy nhất trong cơ sở dữ liệu. Lớp này thường được gọi là lớp model.
- Một đối tượng của lớp ánh xạ tới một hàng trong bảng.
- Khi bạn định nghĩa một lớp model, bạn có thể truy cập các phương thức được định sẵn để tạo, đọc, cập nhật và xóa dữ liệu.
Django cũng tự động tạo ra một trang quản trị để quản lý dữ liệu của các model. Hãy cùng xem qua một ví dụ đơn giản để thấy cách hoạt động của Django ORM.
Thiết lập dự án Django ORM bằng Python
Tạo môi trường ảo mới
Đầu tiên, tạo môi trường ảo mới bằng cách sử dụng module venv
tích hợp sẵn:
python -m venv venv
Thứ hai, kích hoạt môi trường ảo:
venv\scripts\activate
Cài đặt gói django
và django-extensions
:
pip install django django-extensions
Gói django-extensions
cung cấp cho bạn một số phần mở rộng tùy chỉnh cho framework Django. Mình sẽ sử dụng gói django-extensions
để xuất SQL được tạo ra bởi Django ORM.
Tạo dự án mới
Đầu tiên, tạo một dự án Django mới tên là django_orm
:
django-admin startproject django_orm
Thứ hai, tạo một ứng dụng HR bên trong dự án django_orm
:
cd django_orm python manage.py startapp hr
Thứ ba, đăng ký cả hr
và django_extensions
trong INSTALLED_APPS
của file settings.py
của dự án:
INSTALLED_APPS = [ # ... 'django_extensions', 'hr', ]
Thiết lập máy chủ cơ sở dữ liệu PostgreSQL
Đầu tiên, cài đặt một máy chủ cơ sở dữ liệu PostgreSQL trên máy tính của bạn.
Thứ hai, đăng nhập vào máy chủ cơ sở dữ liệu PostgreSQL. Nó sẽ yêu cầu bạn nhập mật khẩu của người dùng postgres
. Lưu ý rằng bạn sử dụng cùng một mật khẩu mà bạn đã nhập cho người dùng postgres
trong quá trình cài đặt.
psql -U postgres Password for user postgres:
Thứ ba, tạo cơ sở dữ liệu mới với tên hr
và gõ exit
để thoát chương trình psql
:
postgres=# create database hr; CREATE DATABASE postgres=# exit
Kết nối PostgreSQL với Django
Đầu tiên, cấu hình kết nối cơ sở dữ liệu trong file settings.py
của dự án django_orm
:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'hr', 'USER': 'postgres', 'PASSWORD': 'POSTGRES_PASSWORD', 'HOST': 'localhost', 'PORT': '', } }
Lưu ý rằng bạn thay đổi POSTGRES_PASSWORD
thành mật khẩu của bạn.
Thứ hai, cài đặt gói psycopg2
để cho phép Django kết nối với máy chủ cơ sở dữ liệu PostgreSQL:
pip install psycopg2
Chạy máy chủ phát triển Django:
python manage.py runserver
Bạn sẽ thấy trang chủ mặc định của Django.
Khởi tạo model với Django bằng Python
Đầu tiên, khởi tạo một lớp Employee
trong ứng dụng hr
có hai trường first_name
và last_name
:
from django.db import models class Employee(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) def __str__(self): return f'{self.first_name} {self.last_name}'
Thứ hai, tạo các migration bằng lệnh makemigrations
:
python manage.py makemigrations
Output:
Migrations for 'hr': hr\migrations\0001_initial.py - Create model Employee
Thứ ba, áp dụng các thay đổi vào cơ sở dữ liệu bằng lệnh migrate
:
python manage.py migrate
Django tạo ra rất nhiều bảng bao gồm các bảng cho các model tích hợp sẵn như User
và Group
. Trong hướng dẫn này, mình sẽ tập trung vào lớp Employee
.
Dựa trên lớp model Employee
, Django ORM tạo ra một bảng hr_employee
trong cơ sở dữ liệu:
Django kết hợp tên ứng dụng và tên lớp để tạo ra tên bảng:
app_modelclass
Trong ví dụ này, tên ứng dụng là hr
và tên lớp là Employee
. Do đó, Django tạo ra bảng với tên hr_employee
. Lưu ý rằng Django chuyển tên lớp thành chữ thường trước khi thêm nó vào tên ứng dụng.
Lớp model Employee
có hai trường first_name
và last_name
. Vì lớp Employee
kế thừa từ lớp models.Model
, Django tự động thêm trường id
như một trường tự động tăng gọi là id
. Do đó, bảng hr_employee
có ba cột id
, first_name
và last_name
.
Tương tác với bảng hr_employee
Django bằng Python
Để tương tác với bảng hr_employee
, bạn có thể chạy lệnh shell_plus
đi kèm với gói django-extensions
.
Lưu ý rằng Django cung cấp cho bạn lệnh shell
tích hợp sẵn. Tuy nhiên, lệnh shell_plus
thuận tiện hơn khi làm việc. Ví dụ, nó tự động tải các model được định nghĩa trong dự án và hiển thị SQL được tạo ra.
Chạy lệnh shell_plus
với tùy chọn --print-sql
:
python manage.py shell_plus --print-sql
Thêm dữ liệu
Đầu tiên, tạo một đối tượng Employee
mới và gọi phương thức save()
để thêm một hàng mới vào bảng:
>>> e = Employee(first_name='freetuts', last_name='.net') >>> e.save()
Output:
INSERT INTO "hr_employee" ("first_name", "last_name") VALUES ('John', 'Doe') RETURNING "hr_employee"."id" Execution time: 0.003234s [Database: default]
Trong ví dụ này, bạn không cần đặt giá trị cho cột id
. Cơ sở dữ liệu tự động tạo giá trị cho nó và Django sẽ đặt nó sau khi bạn thêm một hàng mới vào bảng.
Như đã thấy trong output, Django sử dụng câu lệnh INSERT
để thêm một hàng mới với hai cột first_name
và last_name
vào bảng hr_employee
.
Thứ hai, thêm nhân viên thứ hai với tên Jane
và họ Doe
:
>>> e = Employee(first_name='Ngoc', last_name='Hoa') >>> e.save()
Output:
INSERT INTO "hr_employee" ("first_name", "last_name") VALUES ('Jane', 'Doe') RETURNING "hr_employee"."id" Execution time: 0.002195s [Database: default]
Bây giờ, bảng hr_employee
có hai hàng với id
là 1 và 2.
Chọn dữ liệu
Để chọn tất cả các hàng từ bảng hr_employees
, bạn sử dụng phương thức all()
như sau:
>>> Employee.objects.all()
Output:
SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name" FROM "hr_employee" LIMIT 21 Execution time: 0.000000s [Database: default] <QuerySet [<Employee: freetuts .net>, <Employee: Ngoc Hoa>]>
Chọn một hàng bằng id
Để chọn một hàng duy nhất theo id, bạn có thể sử dụng phương thức get()
. Ví dụ, đoạn mã sau trả về nhân viên có id là 1:
>>> e = Employee.objects.get(id=1)
Output:
SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name" FROM "hr_employee" WHERE "hr_employee"."id" = 1 LIMIT 21 Execution time: 0.000999s [Database: default] >>> Employee.objects.filter(first_name='Hoa')
Không giống như phương thức all()
, phương thức get()
trả về một đối tượng Employee
thay vì một QuerySet
.
Tìm kiếm nhân viên theo tên
Để tìm kiếm nhân viên theo tên, bạn có thể sử dụng phương thức filter()
của đối tượng QuerySet
. Ví dụ, đoạn mã sau tìm nhân viên có tên là Jane
:
>>> Employee.objects.filter(first_name='Hoa')
Output:
SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name" FROM "hr_employee" WHERE "hr_employee"."first_name" = 'Hoa' LIMIT 21 Execution time: 0.000000s [Database: default] <QuerySet [<Employee: >]>
Cập nhật dữ liệu
Đầu tiên, chọn nhân viên có id là 2:
>>> e = Employee.objects.get(id=2)
Output:
SELECT "hr_employee"."id", "hr_employee"."first_name", "hr_employee"."last_name" FROM "hr_employee" WHERE "hr_employee"."id" = 2 LIMIT 21 Execution time: 0.001022s [Database: default]
Thứ hai, cập nhật họ của nhân viên được chọn thành Smith
:
>>> e.last_name = 'Smith' >>> e.save()
Output:
UPDATE "hr_employee" SET "first_name" = 'Ngoc', "last_name" = 'Smith' WHERE "hr_employee"."id" = 2 Execution time: 0.004019s [Database: default] >>> e <Employee: Hoa Smith>
Xóa dữ liệu
Để xóa một đối tượng model, bạn sử dụng phương thức delete()
. Ví dụ sau đây xóa nhân viên có id là 2:
>>> e.delete()
Output:
DELETE FROM "hr_employee" WHERE "hr_employee"."id" IN (2) Execution time: 0.002001s [Database: default] (1, {'hr.Employee': 1})
Để xóa tất cả các đối tượng của model, bạn sử dụng phương thức all()
để chọn tất cả các nhân viên và gọi phương thức delete()
để xóa tất cả các nhân viên đã chọn:
>>> Employee.objects.all().delete()
Output:
DELETE FROM "hr_employee" Execution time: 0.001076s [Database: default] (1, {'hr.Employee': 1})
Django sử dụng câu lệnh DELETE
mà không có điều kiện WHERE
để xóa tất cả các hàng từ bảng hr_employee
.
Bạn có thể tải dự án Django ORM trong Python xuống tại đây.
Kết bài
Django ORM là một công cụ không thể thiếu đối với các nhà phát triển sử dụng Django, giúp tương tác với cơ sở dữ liệu quan hệ một cách dễ dàng và hiệu quả thông qua API Python. Bằng cách sử dụng mô hình active record, Django ORM biến việc quản lý dữ liệu trở nên trực quan và logic hơn, khi mỗi lớp ánh xạ tới một bảng và mỗi đối tượng ánh xạ tới một hàng trong bảng đó.
Các phương thức như all()
, get()
, filter()
, save()
, và delete()
cung cấp những cách thức mạnh mẽ để thao tác với dữ liệu, từ việc lấy tất cả các hàng, chọn hàng theo id, lọc dữ liệu theo điều kiện, đến việc tạo mới, cập nhật và xóa dữ liệu. Nhờ vào Django ORM, các nhà phát triển có thể tập trung hơn vào việc xây dựng chức năng và logic của ứng dụng, thay vì lo lắng về các chi tiết phức tạp của việc truy vấn cơ sở dữ liệu. Qua bài viết này, hy vọng bạn đã có cái nhìn rõ nét hơn về sức mạnh và sự tiện lợi của Django ORM trong phát triển ứng dụng web.
Danh sách file tải về
Tên file tải về | Pass giải nén |
---|---|
Django ORM trong Python | Không có |