高级型号

模型可以提供比仅有关对象的数据更多的信息。让我们看一个例子并将其分解为对它有用的内容:

from django.db import models
from django.urls import reverse
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Book(models.Model):
    slug = models.SlugField()
    title = models.CharField(max_length=128)
    publish_date = models.DateField()

    def get_absolute_url(self):
        return reverse('library:book', kwargs={'pk':self.pk})

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['publish_date', 'title']

自动主键

你可能会注意到 self.pkget_absolute_url 方法中的使用。pkfield 是模型主键的别名。此外,如果缺少主键,django 将自动添加主键。这是一个不用担心的事情,让你可以为任何模型设置外键并轻松获取它们。

绝对的网址

定义的第一个函数是 get_absolute_url。这样,如果你有一本书,你可以获得一个链接,而无需摆弄网址标记,解析,属性等。只需拨打 book.get_absolute_url 即可获得正确的链接。作为奖励,你在 django 管理员中的对象将获得一个网站视图按钮。

字符串表示

使用 __str__ 方法可以在需要显示时使用该对象。例如,使用上一种方法,在模板中添加书籍链接就像 <a href="{{ book.get_absolute_url }}">{{ book }}</a> 一样简单。开门见山。例如,对于外键,此方法还控制管理下拉列表中显示的内容。

类装饰器允许你在 python 2 上为 __str____unicode__ 定义一次方法,同时在 python 3 上没有问题。如果你希望你的应用程序在两个版本上运行,那就是要走的路。

S field 场

slug 字段类似于 char 字段但接受较少的符号。默认情况下,只有字母,数字,下划线或连字符。如果你想在 url 中使用漂亮的表示来标识对象,这很有用。

Meta 类

Meta 类让我们在整个项目集合中定义了更多的信息。此处仅设置默认排序。例如,它对 ListView 对象很有用。它需要一个理想的用于排序的字段列表。在这里,如果日期相同,书籍将首先按出版日期排序,然后按标题排序。

其他常客属性是 verbose_nameverbose_name_plural。默认情况下,它们是从模型的名称生成的,应该没问题。但是复数形式是天真的,只是简单地将’s’附加到单数形式,所以你可能想要在某些情况下明确地设置它。