DJANGO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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 djangodjango-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ả hrdjango_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.

Screenshot 202024 05 25 20211518 png

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_namelast_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ư UserGroup. 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 ORM example png

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_namelast_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_namelast_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_namelast_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ó

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top