Kunci Asing
Termasuk bagian Model dan Admin dalam perjalanan Django di Coddy. Pelajaran 16 dari 23.
Dua bukumu ditulis oleh Jane Austen, dan namanya tercantum di keduanya: jika kamu memperbaiki salah ketik, kamu harus memperbaikinya dua kali. Simpan setiap penulis satu kali, masing-masing di tabel tersendiri, lalu biarkan setiap buku menunjuk ke penulisnya. Penunjuk itu adalah ForeignKey. Loan, yaitu buku yang kamu pinjamkan kepada teman, akan menunjuk ke bukunya:
class Loan(models.Model):
book = models.ForeignKey(Book, on_delete=models.PROTECT)
friend = models.CharField(max_length=100)
lent_on = models.DateField()Kolom tersebut menyimpan id buku, book_id; di Python, loan.book adalah Book itu sendiri. Banyak pinjaman dapat menunjuk ke satu buku: hubungan banyak-ke-satu.
on_delete wajib diisi: opsi ini menentukan apa yang terjadi pada pinjaman saat bukunya dihapus. CASCADE ikut menghapus pinjaman, PROTECT menolak penghapusan buku, dan SET_NULL mengosongkan field, yang kemudian memerlukan null=True.
Model Author sudah siap, dan __str__-nya adalah nama penulis, sehingga {{ book.author }} di template-mu tetap berfungsi.
Tantangan
SedangDi books/models.py, ubah Book.author dari teks menjadi tautan ke Author. Saat seorang penulis dihapus, buku-bukunya ikut dihapus.
Tekan Jalankan dan buka tab Data: books.Author menyimpan enam penulis, dan baris buku menyimpan id mereka.
Coba sendiri
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}"
Semua pelajaran di Model dan Admin
Latihan sendiri: Playground Django