Klucze obce
Część sekcji Modele i panel administracyjny ścieżki Django w Coddy. Lekcja 16 z 23.
Dwie z Twoich książek są autorstwa Jane Austen, a jej nazwisko jest wpisane w obu: popraw literówkę, a trzeba będzie poprawić ją dwa razy. Przechowuj każdego autora tylko raz, w osobnej tabeli, i przypisuj każdą książkę do jej autora. To przypisanie to ForeignKey. Loan, czyli książka pożyczona znajomemu, wskazywałaby na swoją książkę:
class Loan(models.Model):
book = models.ForeignKey(Book, on_delete=models.PROTECT)
friend = models.CharField(max_length=100)
lent_on = models.DateField()Kolumna przechowuje identyfikator książki, book_id; w Pythonie loan.book to sama instancja Book. Wiele wypożyczeń może wskazywać na jedną książkę: jest to relacja wiele do jednego.
on_delete jest wymagane: określa, co stanie się z wypożyczeniami po usunięciu ich książki. CASCADE usuwa je również, PROTECT uniemożliwia usunięcie książki, a SET_NULL czyści pole, co wymaga wtedy ustawienia null=True.
Model Author jest gotowy, a jego __str__ zwraca nazwę, więc {{ book.author }} w szablonach nadal będzie działać.
Wyzwanie
ŚredniW pliku books/models.py zmień Book.author z tekstu na odwołanie do Author. Gdy autor zostanie usunięty, jego książki również zostaną usunięte.
Naciśnij „Uruchom” i kliknij Dune: na stronie nadal widnieje informacja, że autorem jest Frank Herbert.
Spróbuj swoich sił
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}"
Wszystkie lekcje w sekcji Modele i panel administracyjny
Poćwicz samodzielnie: Edytor online Django