Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。python
它们各自的职责以下:git
层次 | 职责 |
---|---|
模型(Model),即数据存取层 | 处理与数据相关的全部事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 |
模板(Template),即业务逻辑层 | 处理与表现相关的决定: 如何在页面或其余类型文档中进行显示。 |
视图(View),即表现层 | 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 |
简单来讲就是Model存取数据,View决定须要调取哪些数据,而Template则负责将调取出的数据以合理的方式展示出来。github
在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型Model,也就是数据库结构设计和附加的其它元数据。数据库
模型包含了储存的数据所必要的字段和行为。Django 的目标是你只须要定义数据模型,其它的杂七杂八代码你都不用关心,它们会自动从模型生成。django
因此让咱们首先搞定Model。编程
如前面所讲,Django中一般一个模型(Model)映射一个数据库,处理与数据相关的事务。bash
对博客网站来讲,最重要的数据就是文章。因此首先来创建一个存放文章的数据模型。session
打开article/models.py
文件,输入以下代码:框架
article/models.py
from django.db import models
# 导入内建的User模型。
from django.contrib.auth.models import User
# timezone 用于处理时间相关事务。
from django.utils import timezone
# 博客文章数据模型
class ArticlePost(models.Model):
# 文章做者。参数 on_delete 用于指定数据删除的方式,避免两个关联表的数据不一致。
author = models.ForeignKey(User, on_delete=models.CASCADE)
# 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,好比标题
title = models.CharField(max_length=100)
# 文章正文。保存大量文本使用 TextField
body = models.TextField()
# 文章建立时间。参数 default=timezone.now 指定其在建立数据时将默认写入当前的时间
created = models.DateTimeField(default=timezone.now)
# 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间
updated = models.DateTimeField(auto_now=True)
复制代码
代码很是直白。**每一个模型被表示为 django.db.models.Model
类的子类。**每一个模型有一些类变量,它们都表示模型里的一个数据库字段。编程语言
**每一个字段都是 Field
类的实例 。**好比字符字段被表示为 CharField
,日期时间字段被表示为 DateTimeField
。这将告诉 Django 每一个字段要处理的数据类型。
**定义某些 Field
类实例须要参数。**例如 CharField
须要一个 max_length
参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据。
**使用 ForeignKey
定义一个关系。**这将告诉 Django,每一个(或多个) ArticlePost
对象都关联到一个 User
对象。Django自己具备一个简单完整的帐号系统(User),足以知足通常网站的帐号申请、创建、权限、群组等基本功能。
ArticlePost
类定义了一篇文章所必须具有的要素:做者、标题、正文、建立时间以及更新时间。**咱们还能够额外再定义一些内容,规范ArticlePost
中数据的行为。**加入如下代码:
article/models.py
...
class ArticlePost(models.Model):
...
# 内部类 class Meta 用于给 model 定义元数据
class Meta:
# ordering 指定模型返回的数据的排列顺序
# '-created' 代表数据应该以倒序排列
ordering = ('-created',)
# 函数 __str__ 定义当调用对象的 str() 方法时的返回值内容
def __str__(self):
# return self.title 将文章标题返回
return self.title
复制代码
内部类Meta
中的ordering
定义了数据的排列方式。-created
表示将以建立时间的倒序排列,保证了最新的文章老是在网页的最上方。注意ordering
是元组,括号中只含一个元素时不要忘记末尾的逗号。
**__str__
方法定义了须要表示数据时应该显示的名称。**给模型增长 __str__
方法是很重要的,它最多见的就是在Django管理后台中作为对象的显示值。所以应该老是返回一个友好易读的字符串。后面会看到它的好处。
整理并去掉注释,所有代码放在一块儿是这样:
article/models.py
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class ArticlePost(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
body = models.TextField()
created = models.DateTimeField(default=timezone.now)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('-created',)
def __str__(self):
return self.title
复制代码
恭喜你,你已经完成了博客网站最核心的数据模型的大部份内容。
代码不到20行,是否是彻底没啥感受。后面会慢慢体会Django的强大。
另外建议新手不要复制粘贴代码。科学代表,缓慢的敲入字符有助于提升编程水平。
这部份内容若是不能理解也不要紧,先跳过,待水平提升再回过头来阅读。
Django框架基于python语言,而在python中用import
或者from...import
来导入模块。
模块其实就一些函数和类的集合文件,它能实现一些相应的功能。当咱们须要使用这些功能的时候,直接把相应的模块导入到咱们的程序中就可使用了。
import
用于导入整个功能模块。但实际使用时每每只须要用模块中的某一个功能,为此导入整个模块有点大材小用,所以能够用from a import b
表示从模块a
中导入b
给我用就能够了。
Python做为面向对象编程语言,最重要的概念就是类(Class)和实例(Instance)。
类是抽象的模板,而实例是根据这个类建立出来的一个个具体的“对象”。每一个对象都拥有相同的方法,但各自的数据可能不一样。而这些方法被打包封装在一块儿,就组成了类。
好比说咱们刚写的这个ArticlePost
类,做用就是就为博客文章的内容提供了一个模板。每当有一篇新文章生成的时候,都要比对ArticlePost
类来建立author
、title
、body
...等等数据;虽然每篇文章的具体内容可能不同,可是必须都遵循相同的规则。
在Django中,数据由模型来处理,而模型的载体就是类(Class)。
字段(field)表示数据库表的一个抽象类,Django使用字段类建立数据库表,并将Python类型映射到数据库。
在模型中,字段被实例化为类属性并表示特定的表,同时具备将字段值映射到数据库的属性及方法。
比方说ArticlePost
类中有一个title
的属性,这个属性中保存着Charfield
类型的数据:即一个较短的字符串。
ForeignKey
是用来解决“一对多”问题的,用于关联查询。
什么叫“一对多”?
在咱们的ArticlePost模型中,一篇文章只能有一个做者,而一个做者能够有不少篇文章,这就是“一对多”关系。
又好比一个班级的同窗中,每一个同窗只能有一种性别,而每种性别能够对应不少的同窗,这也是“一对多”。
所以,经过ForeignKey
外键,将User
和ArticlePost
关联到了一块儿,最终就是将博客文章的做者和网站的用户关联在一块儿了。
既然有“一对多”,固然也有**“一对一”(OneToOneField
)、“多对多”(ManyToManyField
)**。目前用不到这些外键,后面再回头来对比其差异。
注意这里有个小坑,Django2.0 以前的版本on_delete
参数能够不填;Django2.0之后on_delete
是必填项,不写会报错。
内部类class Meta
用来使用类提供的模型元数据。模型元数据是**“任何不是字段的东西”**,例如排序选项ordering
、数据库表名db_table
、单数和复数名称verbose_name
和 verbose_name_plural
。要不要写内部类是彻底可选的,固然有了它能够帮助理解并规范类的行为。
在class ArticlePost
中咱们使用的元数据ordering = ('-created',)
,代表了每当我须要取出文章列表,做为博客首页时,按照-created
(即文章建立时间,负号标识倒序)来排列,保证了最新文章永远在最顶部位置。
编写好了Model后,接下来就须要进行数据迁移。
迁移是Django对模型所作的更改传递到数据库中的方式。所以每当对数据库进行了更改(添加、修改、删除等)操做,都须要进行数据迁移。
Django 的迁移代码是由你的模型文件自动生成的,它本质上只是个历史记录,Django 能够用它来进行数据库的滚动更新,经过这种方式使其可以和当前的模型匹配。
在虚拟环境中进入my_blog
文件夹(还没熟悉venv的再温习: 在Windows中搭建Django的开发环境),输入python manage.py makemigrations
,对模型的更改建立新的迁移表:
(env) e:\django_project\my_blog>python manage.py makemigrations
Migrations for 'article':
article\migrations\0001_initial.py
- Create model ArticlePost
(env) e:\django_project\my_blog>
复制代码
经过运行 makemigrations
命令,Django 会检测你对模型文件的修改,而且把修改的部分储存为一次迁移。
而后输入python manage.py migrate
,应用迁移到数据库中:
(env) e:\django_project\my_blog>python manage.py migrate
Operations to perform:
Apply all migrations: admin, article, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
...
Applying sessions.0001_initial... OK
(env) e:\django_project\my_blog>
复制代码
migrate
命令选中全部尚未执行过的迁移并应用在数据库上,也就是将模型的更改同步到数据库结构上。迁移是很是强大的功能,它能让你在开发过程当中持续的改变数据库结构而不须要从新删除和建立表。它专一于使数据库平滑升级而不会丢失数据。
有点拗口,若是没懂也不要紧,总之在迁移以后,对Model的编写就算完成了。
本章初步了解了Django的MTV模式,编写了博客文章的Model模型ArticlePost
,并将其迁移到了数据库中。
下一步就向View进军,学习如何调取模型中的数据。
有疑问请在杜赛的我的网站留言,我会尽快回复。
或Email私信我:dusaiphoto@foxmail.com
项目完整代码:Django_blog_tutorial
转载请告知做者并注明出处。