Menu
CoddyTech

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 wpisano w obu: popraw literówkę, a poprawisz ją dwukrotnie. Zachowaj każdego autora tylko raz, w osobnej tabeli, i pozwól, by każda książka wskazywała swojego autora. Ten wskaźnik to ForeignKey. Loan, czyli książka pożyczona znajomemu, wskazywałby 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ć jedną książkę: 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 nazwisko, więc {{ book.author }} w szablonach nadal będzie działać.

challenge icon

Wyzwanie

Średni

W 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 Run i otwórz kartę Data: w books.Author znajduje się sześciu autorów, a wiersze książek zawierają ich identyfikatory.

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