高级型号
模型可以提供比仅有关对象的数据更多的信息。让我们看一个例子并将其分解为对它有用的内容:
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.pk
在 get_absolute_url
方法中的使用。pk
field 是模型主键的别名。此外,如果缺少主键,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_name
和 verbose_name_plural
。默认情况下,它们是从模型的名称生成的,应该没问题。但是复数形式是天真的,只是简单地将’s’附加到单数形式,所以你可能想要在某些情况下明确地设置它。