Menu
CoddyTech

Yabancı Anahtarlar

Coddy'nin Django Journey'sinin Modeller ve Yönetim Paneli bölümünün bir parçası. Ders 16 / 23.

Kitaplarından ikisi Jane Austen'a ait ve adı ikisinde de yazılı: bir yazım hatasını düzeltirsen iki kez düzeltmiş olursun. Her yazarı kendi tablosunda bir kez tut ve her kitabın yazarına işaret etmesini sağla. Bu işaretçi bir ForeignKey'dir. Bir arkadaşına ödünç verdiğin kitap olan Loan, kitabına işaret eder:

class Loan(models.Model):
    book = models.ForeignKey(Book, on_delete=models.PROTECT)
    friend = models.CharField(max_length=100)
    lent_on = models.DateField()

Sütun, kitabın kimliğini, book_id'yi saklar; Python'da loan.book, Book nesnesinin kendisidir. Birçok ödünç kaydı tek bir kitaba işaret edebilir: çoktan-bire ilişki.

on_delete zorunludur: kitap silindiğinde ödünç kayıtlarına ne olacağını belirtir. CASCADE onları da siler, PROTECT kitabın silinmesini engeller ve SET_NULL alanı boşaltır; bunun için null=True gerekir.

Bir Author modeli hazır ve __str__ yöntemi adı döndürüyor; böylece şablonlarındaki {{ book.author }} çalışmaya devam eder.

challenge icon

Görev

Orta

books/models.py dosyasında Book.author alanını metin yerine Author bağlantısı olacak şekilde değiştir. Bir yazar silindiğinde, kitapları da onunla birlikte silinir.

“Run” düğmesine bas ve Dune’a tıkla: sayfasında hâlâ Frank Herbert yazıyor.

Kendin dene

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}"

Modeller ve Yönetim Paneli bölümündeki tüm dersler

Kendi başına pratik yap: Django playground