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'ın ve ikisinde de adı yazılı: bir yazım hatasını düzeltirsen aynı düzeltmeyi iki kez yapmış olursun. Her yazarı kendi tablosunda yalnızca 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 bir 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'un kendisidir. Birden çok ödünç kaydı tek bir kitaba işaret edebilir: bu, çoktan-bire ilişkisidir.
on_delete gereklidir: kitabı 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__ özelliği ad olduğundan, şablonlarındaki {{ book.author }} çalışmaya devam eder.
Görev
Ortabooks/models.py dosyasında Book.author alanını metin olmaktan çıkarıp Author bağlantısına dönüştür. Bir yazar silindiğinde, kitapları da onunla birlikte silinir.
Run düğmesine bas ve Data sekmesini aç: books.Author altı yazarı tutar ve kitap satırları onların kimliklerini tutar.
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