Quy Trình Tạo Bảng và Cấu Trúc Cơ Sở Dữ Liệu trong Django

Mục lục- Cấu hình cơ sở dữ liệu

  • Các lệnh di chuyển cơ sở dữ liệu
  • Tạo cấu trúc bảng
  • Ví dụ: Bảng nhà xuất bản và sách
  • Bảng lớp học và sinh viên
  • Thiết lập mối quan hệ đa bảng
  • Phương pháp tạo bảng liên kết tùy chỉnh
  • Sử dụng kết hợp bảng tùy chỉnh và ManyToManyField

Cấu hình cơ sở dữ liệu

  • Trong tệp settings.py của dự án Django, cấu hình thông tin kết nối cơ sở dữ liệu:
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "tên_cơ_sở_dữ_liệu_của_bạn",  # Cần tạo cơ sở dữ liệu thủ công
        "USER": "tên_người_dùng_cơ_sở_dữ_liệu",
        "PASSWORD": "mật_khẩu_cơ_sở_dữ_liệu",
        "HOST": "địa_chỉ_IP_cơ_sở_dữ_liệu",
        "PORT": 3306
    }
}
  • Trong tệp __init__.py trong thư mục cùng tên với dự án Django, thêm đoạn mã sau để thông báo cho Django sử dụng mô-đun pymysql để kết nối với cơ sở dữ liệu MySQL:
import pymysql
pymysql.install_as_MySQLdb()
  • Lưu ý: Khi di chuyển cơ sở dữ liệu, có thể xuất hiện cảnh báo:
WARNINGS: 
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion,
 by escalating warnings into errors. It is strongly recommended you activate it.
  • Thêm tham số OPTIONS vào cấu hình: Giải thích từ trang chủ Django
#Giải pháp 1
OPTIONS: {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
        
#Giải pháp 2
#Vào tệp my.ini của mysql
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

#Khởi động lại mysql (hệ thống windows)
net stop mysql
net start mysql

Các lệnh di chuyển cơ sở dữ liệu

#Lệnh di chuyển cơ sở dữ liệu (nên thực hiện cùng nhau)
python manage.py makemigrations
python manage.py migrate
#Mỗi khi thao tác với tệp models.py, hãy thực thi các lệnh di chuyển

Tạo cấu trúc bảng

  • Ví dụ: Bảng nhà xuất bản và sách

  • Bảng nhà xuất bản
from django.db import models

class NhaXuatBan(models.Model):
    id_nxb = models.AutoField(primary_key=True)
    ten_nxb = models.CharField(max_length=32, unique=True)
"""
Thiết kế bảng Nhà xuất bản - Tên bảng: NhaXuatBan
id_nxb là ID của nhà xuất bản, đặt làm khóa chính, mặc định là kiểu int - primary_key=True, tên trường là id_nxb
ten_nxb là tên nhà xuất bản, giới hạn độ dài ký tự 32, đặt thuộc tính unique=True - tên trường là ten_nxb
Có thể thêm các trường khác như điện thoại, địa chỉ văn phòng, ở đây không thêm
"""

class Sach(models.Model):
    tieu_de = models.CharField(max_length=32)
    nha_xuat_ban = models.ForeignKey("NhaXuatBan",on_delete=models.CASCADE)
"""
Thiết kế bảng Sách - Tên bảng: Sach
tieu_de là tiêu sách, giới hạn độ dài ký tự 32
nha_xuat_ban là khóa ngoại models.ForeignKey ("NhaXuatBan") liên kết bảng NhaXuatBan, on_delete=models.CASCADE đặt mối quan hệ liên kết
"""    

  • Cấu trúc bảng

  • Xóa cấp phát (Đặt phía yếu khi đặt cấp phát, khi bên liên kết bị xóa, bản thân cũng bị xóa, khi bản thân bị xóa thì không ảnh hưởng đến bên kia)

Khi xóa Nhà xuất bản Nam, cuốn sách "Nhật ký giảm cân của Đại Béo Tiểu Béo" cũng bị xóa theo

  • Xóa cấp phát, xóa sách "1500 câu hỏi tâm lý" xem có ảnh hưởng đến bảng nhà xuất bản không?

  • Bảng lớp học và sinh viên

class LopHoc(models.Model):
    id_lop = models.AutoField(primary_key=True)
    ten_lop = models.CharField(max_length=32, unique=True)
    """
    id_lop là khóa chính
    ten_lop giới hạn 32 ký tự, unique=True đảm bảo tính duy nhất
    """

class SinhVien(models.Model):
    id_sv = models.AutoField(primary_key=True)
    ten_sv = models.CharField(max_length=32,null=False)
    gioi_tinh = models.CharField(max_length=2,default='Nam')
    lop_id = models.ForeignKey("LopHoc",on_delete=models.CASCADE)
    """
    id_sv là khóa chính
    ten_sv là ký tự 32 ký tự, ràng buộc không rỗng
    gioi_tinh là ký tự 2 ký tự, mặc định là Nam
    lop_id là khóa ngoại liên kết bảng LopHoc, thiết lập cấp phát
    """

Thiết lập mối quan hệ đa bảng

  • Lấy ví dụ nhà xuất bản và sách, thêm tác giả
#Để thực hiện bảng tác giả liên kết với bảng nhà xuất bản và sách, tạo bảng thứ tư để thiết lập liên kết

#Phương pháp đầu tiên: Django tự tạo bảng thứ ba
class TacGia(models.Model):
    ten_tac_gia = models.CharField(max_length=32)
    sach = models.ManyToManyField('Sach')  # Không tạo trường trong bảng TacGia, tự tạo bảng thứ ba
    """
    ten_tac_gia là tên tác giả, 32 ký tự
    sach là mối quan hệ nhiều-nhiều giữa TacGia và Sach. sach là tất cả đối tượng liên kết giữa TacGia và Sach.
    sach tạo một đối tượng quan hệ trung gian trong bảng thứ ba, sau đó lấy các đối tượng liên quan trong bảng Sach dựa trên đối tượng quan hệ trung gian này
    """

  • Xem cơ sở dữ liệu

Phương pháp tạo bảng liên kết tùy chỉnh

class TacGiaSach(models.Model):
    tac_gia = models.ForeignKey(TacGia, on_delete=models.CASCADE)
    sach = models.ForeignKey(Sach, on_delete=models.CASCADE)
    ngay_xuat_ban = models.DateField()
    """
    tac_gia liên kết bảng TacGia, khóa ngoại, thiết lập cấp phát
    sach liên kết bảng Sach, khóa ngoại, thiết lập cấp phát
    ngay_xuat_ban thuộc tính ngày
    Có thể thêm nhiều trường khác, sẽ phức tạp hơn
    """
#Phương pháp gọi
tac_gia_obj = models.TacGia.objects.create(ten_tac_gia=ten_tac_gia) # Chèn nội dung vào bảng sach
tac_gia_obj.sach.set(books)  # Thiết lập mối quan hệ nhiều-nhiều giữa tác giả và sách

Sử dụng kết hợp bảng tùy chỉnh và ManyToManyField

class TacGia(models.Model):
    ten_tac_gia = models.CharField(max_length=32)
    sach = models.ManyToManyField('Sach',through='TacGiaSach')  # through='TacGiaSach' không tạo trường trong bảng TacGia,
cũng không tạo bảng thứ ba


class TacGiaSach(models.Model):
    tac_gia = models.ForeignKey(TacGia, on_delete=models.CASCADE)#khóa ngoại liên kết bảng TacGia, thiết lập cấp phát
    sach = models.ForeignKey(Sach, on_delete=models.CASCADE)#khóa ngoại liên kết bảng Sach, thiết lập cấp phát
    ngay_xuat_ban = models.DateField()#có thể thêm nhiều trường khác

Thẻ: Django orm models Database migrations

Đăng vào ngày 3 tháng 6 lúc 04:50