Menu
CoddyTech

一本书如何打印

本课属于 Coddy Django 学习旅程的“模型和管理后台”单元。第 5 课,共 23 课。

点击“运行”,并在 Shell 标签页中输入 Book.objects.all():每本书都显示为 <Book: Book object (1)>,你无法区分它们。Book.objects.all() 会请求所有书籍,下一章会解释它。Python 会通过对象的 __str__ 方法将对象转换为文本,而每个模型都会获得的默认方法只显示 id。模型可以定义自己的方法。电影网站中的 Movie 可能会显示影片名称和年份:

class Movie(models.Model):
    ...

    def __str__(self):
        return f"{self.title} ({self.released.year})"

这样,Shell 中就会显示 <Movie: Alien (1979)>,管理后台和任何打印 {{ movie }} 的模板中也会如此。__str__ 必须返回文本。只打印文本的方法会返回 None,此时 str() 会因 TypeError 而失败。

challenge icon

挑战

简单

在 books/models.py 中,让书籍打印为书名、by 和作者,例如:Dune by Frank Herbert。

点击“运行”,并在 Shell 选项卡中输入 Book.objects.all():现在每本书都会显示为 <Book: Dune by Frank Herbert>。

亲手试试

from django.db import models


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)

模型和管理后台中的所有课

自己练习: Django 在线编辑器