Dùng Model tạo Bảng Database trong Python Django

Nội dung

Bài này sẽ giới thiệu những nội dung sau:

  • Khái niệm ORM
  • Tạo bảng Post để lưu trữ các bài viết
  • Migration là gì?

Khái niệm ORM

Object-Relational Mapping (ORM) là một kĩ thuật cho phép chúng ta truy vấn và quản lý dữ liệu từ database bằng cách sử dụng mô hình hướng đối tượng. Khi nhắc đến ORM, hầu hết mọi người đều nói đến thư viện đã áp dụng kĩ thuật ORM.

Những thư viện ORM là những thư viện đã hoàn chỉnh được viết bằng ngôn ngữ lập trình bạn đang dùng và nó đã gói nhóm code cần thiết để quản lý data, như vậy bạn không cần sử dụng SQL nữa, bạn sẽ tương tác trực tiếp qua cách viết hướng đối tượng của ngôn ngữ bạn đang sử dụng


Tạo bảng Post lưu trữ các bài viết

Bây giờ Kteam sẽ tạo một app Blog nhằm quản lý các table liên quan đến bài viết, đầu tiên sẽ dùng lệnh startapp để tạp app Blog:

python manage.py startapp blog

Sau đó, khai báo settings.py có thêm app mới:

Bây giờ ta vào file models.py trong app blog để thiết kế bảng Post:

Kteam muốn tạo một bảng Post có 3 cột là:

  • title: lưu tiêu đề bài viết, có đồ dài tối đa là 100 kí tự
  • body: nội dung bài viết, không giới hạn kí tự
  • date: ngày viết bài, tự thêm ngày hiện tại khi tạo ra bài viết

Dựa vào thư viện models được hỗ trợ trong Django, Kteam sẽ thiết kế class Post để map với bảng Post như sau:

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)

Ý nghĩa dòng code như sau:

  • Khai báo class Post kế thừa models.Model, là class được viết ra ánh xạ đến bảng trong Database.
  • Khai báo field title ánh xạ đến cột title trong bảng. Field title sẽ thuộc CharField có tham số max_length=100, có nghĩa cột title sẽ lưu trữ kiểu String và dài nhất 100 ký tự.
  • Khai báo field body ánh xạ đến cột body trong bảng. Field body sẽ thuộc TextField, có nghĩa cột body lưu trữ kiểu String vài không giới hạn độ dài.
  • Khai báo field  date ánh xạ đến cột date trong bảng. Field date sẽ có thuộc tính DateTimeField có tham số auto_now_add=True, có nghĩa cột date lưu kiểu Date và tự động thêm ngày hiện tại cho record mới.

Migrations là gì?

Migrations là những cách Django kiểm tra sự thay đổi mà bạn đã tác động đến các models (thêm hay xoá model, thêm sửa xoá các field trong models, …) mà bạn muốn nó tác động đến database của bạn. Migrations được thiết kế cách tự động, tuy nhiên bạn nên cần biết để dễ config và chỉnh sửa.

Như hướng dẫn trên, Kteam vừa thiết kế xong model Post, bây giờ chúng ta bắt đầu cho Django tác động đến Database bây giờ.

Như những bài trước có nói về Database, khi bạn mới tạo project Django, Django sẽ mặc định config là database SQLite, là 1 database đơn giản giúp bạn dễ học và dễ làm dự án lúc đầu. Ở file settings.py có dòng code này thể hiện rõ:

Django hiện tại chỉ có hỗ trợ ORM cho 4 hệ quản trị cơ sở dữ liệu là: SQLiteMySQLPostgreSQL và Oracle. Nếu bạn muốn đổi sử dụng Database trong nhóm này thì có thể đọc ở link này để tham khảo.

Bây giờ, chúng ta sẽ tạo ra file migration cho Database ta đã thiết kế một model Post trong app blog:

python manage.py makemigrations blog

Lệnh makemigrations để tạo các file migration, ta thêm blog để báo cho Django biết ta vừa thiết kế ở app blog. Nếu không ghi tên app thì Django sẽ quét toàn bộ các app hiện tại.

Sau khi chạy lệnh này, ở folder migrations trong blog đã có 1 file migration đầu tiên:

File migration này nhằm xử lý sẽ tác động đến database tạo ra bảng Post. Sau này bạn chỉnh sửa các file models.py thì khi makemigrations sẽ có thêm các file migration, nó như là các file lịch sử bạn đã tác động gì đến database.

Bây giờ, ta cần bắt django chạy các file migration này để nó thực hiện đến database. Ta sẽ chạy lệnh migrate để xem kết quả:

Kết quả nói rằng đã chạy các file migration thành công. Bây giờ ta sẽ mở database xem kết quả như thế nào.

Vì bây giờ Kteam đang sử SQLite, nên Kteam sẽ dùng phần mềm DB Browser for SQLite để mở file db.sqlite3 trong project Django:

Như hình ảnh trên, db.sqlite3 đã thêm 1 bảng là blog_post chính là model Post trong app Blog. Ngoài các cột title, body và date thì có thêm cột id (là id để phân biệt các record, giá trị sẽ tự tăng) đây là cột sẽ bắt buộc có ở mỗi table mà Django đã mặc định trước.

Leave a Reply

Your email address will not be published. Required fields are marked *