Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Di 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