1. 设计一个 blog 数据模式
你将通过定义数据模型为你的 blog 设计数据模式。 一个模型就是一个 django.db.models.Model
的 Python 子类,它的每个属性代表着数据库的一个字段。Django 将为每一个在models.py
文件中定义的模型创建一个表。当你创建一个模型时,Django 实际上提供给你一个可以在数据库中轻易查询对象的API。
首先你需要顶一个 Post
模型,把下面这些行的代码放到 blog
应用程序的 models.py
文件中:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published')
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250,
unique_for_date='publish')
author = models.ForeignKey(User,
on_delete=models.CASCADE,
related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices=STATUS_CHOICES,
default='draft')
class Meta:
ordering = ('-publish', )
def __str__(self):
return self.title
这是你的博客文章的数据模型,让我们看看在模型中定义的这些字段:
-
title
: 这个字段是文章的标题,这个字段是CharField
,在SQL数据库中会被翻译为VARCHAR
。 -
slug
: 这个字段是为了使用 URLs 的,slug 是一个 仅仅包含 字母、数字、下划线或连接字符的短标签。你可以使用slug
字段构建对你博客文章一个美丽的,搜索友好的链接。你添加一个unique_for_date
参数 在这个字段,以方便在 文章 URLs 中 使用publish
和slug
. Django 将防止多个文章在一个给定的日期有相同的slug。 -
author
: z这个字段定义了一个 many-to-one(多对一) 关系,意味着一个文章被一个作者编写,一个作者可以编写多篇文章。对于这个字段,Django 将使用相关模型的主键在数据库中创建一个外键。在这个例子中,你依赖于 Django 验证系统的User
模型。这个on_delete
参数在引用对象被删除的时候将采取特殊的行为,这种特殊操作是 SQL 级别的,而不是Django 级别的。使用CASCADE
,当被引用的 用户对象被删除时,在数据库中所有的有关系的博客文章也会被删除。你可以在这个链接 中查看所有的可能的可选项。你可以使用related_name
属性去通过User
反向查找Post
,这将允许你很容易访问到关系对象,你将在后面学习到更多有关这些的知识。 -
body
: 这是 文章的主体。这个字段是一个text
字段,在SQL数据库中将被翻译成TEXT
列。 -
publish
: 这个时间表示文章被发布的时间,你可以使用 Django 的timezone.now
方法作为默认值,这将以感知当前时区的格式返回当前日期时间,你可以为它感知当前时区的版本是Python 中标准的datetime.now
方法。 -
created
: 这个时间表示文章被创建的时间,当你在这里使用auto_now_add
时,一个对象被创建的时候,会自动保存这个时间。 -
updated
: 这个时间表示文章最后被更新的时间,当你在这里使用auto_now
时,一个对象被更新时,会自动保存这个时间。 -
status
: 这个字段表明文章的状态,你使用了一个choices
参数,所以这个字段的值只可能是你给定的可选值。
Django 还附带了许多不同类型的字段,你可以在你们模型中定义他们。你可以在这个链接中发现更多的字段类型信息。
模型中的Meta
类包含元数据,您告诉Django在查询数据库时,默认情况下按publish
字段降序对结果进行排序,你可以通过使用 负号前缀指定为降序,这样最近发布的文章将会最先出现。
这个 __str__()
方法默认把一个对象以人类可读的方式进行展示,django在很多地方都使用到了它,例如在 管理员站点中。
如果你以前使用的Python2.X,现在在Python3.X 中所有的 strings 本质上都是 Unicode , 因此我们仅仅使用
__str__()
方法,并且__unicode__()
方法已经过时了。
2. 激活应用程序
为了能够让 Django 去保持追踪你的应用程序并且根据它的模型创建数据库的表,你不得不去激活它。为了做到这一点,你需要编辑 settings.py
文件,并且在INSTALLED_APPS
中 添加一个 blog.apps.BlogConfig
。看起来如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
]
这个 BlogConfig
类是应用程序的配置,现在 Django 知道了应该要在这个项目中激活你的应用程序并且将能够加载它的模型。
3. 创建和应用迁移
现在你有了一个 blog 文章的数据模型,那么还需要一个用于它的数据库表。Django 自带了一个迁移系统,它用于记录对模型的改变,并允许他们传播到数据库中。正如前面提到的,migrate
命令将对所有在 INSTALLED_APPS
中的应用程序执行迁移。它使数据库与当前的模型和现有迁移同步。
首先你需要为你的 Post
模型创建一个初始化 迁移。在项目根目录下,运行下面的命令:
python manage.py makemigrations blog
你应该得到下面的输出:

Django 将在 blog
应用程序的 migrations
目录中创建一个 0001_initial.py
文件。你可以打开这个文件看看迁移是如何出现的。迁移指定了对数据库中执行的其他迁移和操作的依赖关系,以便与模型更改同步。
让我们来看看 Django根据你的模型在数据库中创建表所要执行的 SQL代码。这个 sqlmigrate
命令接收 迁移的名称,返回它的SQL而不执行它。 运行以下命令去检查第一次迁移的SQL输出:
python manage.py sqlmigrate blog 0001
应该可以看到下面的输出:

确切的输出应该依赖于你所使用的数据库。前面的输出是使用的 SQLite
, 你可以看看这些输出,Django 通过结合应用程序名称和模型名称以小写的方式生成了这个表的名字(blog_post
), 但是您也可以使用db_table
属性在模型的Meta
类中为您的模型指定一个自定义数据库名称。
Django 自动为每一个模型创建一个主键,但是你也可以通过在模型字段指定 primary_key=True
来重写它。 这个默认的主键 id
列,它是一个自增的整数。 此列自动添加到模型中的 id
字段。
让我们把一个新的模型同步到数据库中,运行下面的命令去执行已存在的迁移:
python manage.py migrate
你将最后得到下面这行的输出:

你刚刚为 INSTALLED_APPS
中的所有应用程序完成了迁移,其中包括你的 blog
应用程序。在应用迁移以后,数据库将反应模型的当前状态。
如果你编辑 models.py
文件,通过对模型 添加、移除、改变现有字段,或者是添加了一个新的模型,你就需要使用 makemigrations
命令去创建一个新的迁移。迁移将运行Django跟踪模型的改变。 然后使用 migrate
命令把你的模型和数据库保持同步。
网友评论