מפתחות זרים
חלק מהיחידה מודלים וממשק הניהול במסלול ה-Django של Coddy. שיעור 16 מתוך 23.
שניים מהספרים שלך הם מאת ג'יין אוסטן, ושמה מופיע בשניהם: תקן שגיאת הקלדה אחת ותצטרך לתקן אותה פעמיים. שמור כל מחברת פעם אחת, בטבלה משלה, ותן לכל ספר להצביע על המחברת שלו. המצביע הזה הוא 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 }} בתבניות שלך ימשיך לעבוד.
אתגר
בינוניב־books/models.py, שנו את Book.author מטקסט לקישור אל Author. כשמוחקים מחבר, גם הספרים שלו נמחקים.
לחצו על "שחק" ואז לחצו על Dune: בעמוד שלו עדיין כתוב מאת Frank Herbert.
נסו בעצמכם
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 אונליין