Menu
CoddyTech

מפתחות זרים

חלק מהיחידה מודלים וממשק הניהול במסלול ה-Django של Coddy. שיעור 16 מתוך 23.

שניים מהספרים שלך נכתבו בידי Jane Austen, ושמה מופיע בשניהם: תקן שגיאת הקלדה אחת, ותצטרך לתקן אותה פעמיים. שמור כל מחבר פעם אחת, בטבלה משלו, ותן לכל ספר להפנות אל המחבר שלו. המצביע הזה הוא ForeignKey. רשומת Loan, כלומר ספר שהשאלת לחבר, תפנה לספר שלה:

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

העמודה שומרת את המזהה של הספר, book_id; ב-Python, loan.book הוא אובייקט ה-Book עצמו. הלוואות רבות יכולות להפנות לספר אחד: קשר רבים-לאחד.

חובה לציין on_delete: הוא קובע מה יקרה להלוואות כאשר הספר שלהן יימחק. CASCADE מוחק גם אותן, PROTECT מונע את מחיקת הספר, ו-SET_NULL מרוקן את השדה, ובמקרה כזה צריך להוסיף null=True.

מודל Author כבר מוכן, וה-__str__ שלו מחזיר את השם, כך ש-{{ book.author }} בתבניות שלך ימשיך לעבוד.

challenge icon

אתגר

בינוני

ב־books/models.py, שנה את Book.author מטקסט לקישור אל Author. כשמוחקים מחבר, הספרים שלו נמחקים יחד איתו.

לחץ על Run ופתח את הכרטיסייה Data: books.Author מכיל את ששת המחברים, ושורות הספרים מכילות את המזהים שלהם.

נסו בעצמכם

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

כל השיעורים ביחידה מודלים וממשק הניהול

תרגלו בעצמכם: Django אונליין