Khóa ngoại
Thuộc phần Model và trang quản trị trong hành trình Django của Coddy. Bài học 16 trên 23.
Hai cuốn sách của bạn đều do Jane Austen viết và tên bà được ghi ở cả hai cuốn: sửa một lỗi chính tả thì bạn phải sửa hai lần. Lưu mỗi tác giả một lần trong bảng riêng, rồi để mỗi cuốn sách trỏ đến tác giả của nó. Tham chiếu đó là một ForeignKey. Một khoản mượn, tức là cuốn sách bạn cho bạn bè mượn, sẽ trỏ đến cuốn sách đó:
class Loan(models.Model):
book = models.ForeignKey(Book, on_delete=models.PROTECT)
friend = models.CharField(max_length=100)
lent_on = models.DateField()Cột lưu id của cuốn sách, book_id; trong Python, loan.book chính là cuốn Book. Nhiều khoản mượn có thể trỏ đến một cuốn sách: mối quan hệ nhiều-một.
Bạn phải dùng on_delete: thuộc tính này quy định điều gì xảy ra với các khoản mượn khi cuốn sách bị xóa. CASCADE cũng xóa các khoản mượn, PROTECT ngăn xóa cuốn sách, còn SET_NULL xóa giá trị trong trường, khi đó bạn cần thêm null=True.
Mô hình Author đã sẵn sàng và __str__ của mô hình trả về tên, nên {{ book.author }} trong các template của bạn vẫn hoạt động.
Thử thách
Trung bìnhTrong books/models.py, đổi Book.author từ văn bản thành liên kết đến Author. Khi xóa một tác giả, sách của tác giả đó cũng bị xóa.
Nhấn «Chạy» rồi nhấp vào Dune: trang sách vẫn ghi by Frank Herbert.
Tự làm thử
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Meta:
ordering = ["name"]
def __str__(self):
return self.name
class Book(models.Model):
class Genre(models.TextChoices):
FICTION = "fiction", "Fiction"
SCIFI = "scifi", "Science fiction"
MYSTERY = "mystery", "Mystery"
HISTORY = "history", "History"
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
year = models.IntegerField()
price = models.DecimalField(max_digits=6, decimal_places=2)
is_read = models.BooleanField(default=False)
finished = models.DateField(null=True, blank=True)
summary = models.TextField(blank=True)
genre = models.CharField(max_length=20, choices=Genre, default=Genre.FICTION)
class Meta:
ordering = ["title"]
def __str__(self):
return f"{self.title} by {self.author}"
Tất cả bài học trong Model và trang quản trị
Tự luyện tập: Playground Django