写在前面

Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。
它们各自的职责如下:

层次 职责
模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即业务逻辑层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即表现层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

简单来说就是Model存取数据,View决定需要调取哪些数据,而Template则负责将调取出的数据以合理的方式展现出来。

数据库与模型

数据库是存储电子文件的场所,储存独立的数据集合。一个数据库由多个数据表构成。

啥意思?举个栗子,三年级二班中同学们的花名册就是数据表。有的花名册记录每位同学的考试成绩、有的记录身高体重、还有的记录兴趣爱好…所有的这些花名册都放在老师的柜子里,这个柜子就是“数据库”了。

默认情况下,数据库就是db.sqlite3这个文件了。在网站上线后你可能想换别的数据库,不过目前我们还不需要讨论这个内容。

操作数据库使用的是复杂的SQL语句,它是完全不同于Python的另一种语言,这对新手来说无疑是困难的。

幸运的是,在 Django 里写Web应用并不需要你直接去操作数据库,而是定义好模型(用Python语法就可以了!),模型中包含了操作数据库所必要的命令。也就是说你只需要定义数据模型,其它的底层代码都不用关心,它们会自动从模型生成。

其实它有专门的术语,叫对象关系映射Object Relational
Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。

编写Model.py

如前面所讲,Django中通过模型(Model)映射到数据库,处理与数据相关的事务。

对博客网站来说,最重要的数据就是文章。所以首先来建立一个存放文章的数据模型。

打开article/models.py文件,输入如下代码:

article/models.pyfrom 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)# 文章正文。保存大量文本使用 TextFieldbody = 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.pyfrom django.db import models
from django.contrib.auth.models import User
from django.utils import timezoneclass 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的强大。

抄还是敲?

学习本教程时,代码部分直接拷贝还是纯手敲?

直接拷贝的优点是学得很快,理解原理后,把代码往自己项目中刷刷刷拷贝过去,几下就能运行了。但这要求学习者有较强的自律能力:什么程度才能算已经“理解”了?

纯手敲就避免了这个问题,想快也快不起来,还经常遇到bug,在解决的过程中纠正自身的习惯性问题。但是手敲的好处必须保证你敲的时候大脑没有放空。
博主的建议是:

  • 模型、视图代码量不多,又是重点学习内容,尽量纯手敲。
  • 模板根据个人情况,适当拷贝。

视图、模板马上就会讲到。

代码分解

这部分内容不能理解也没关系,先跳过,待水平提高再回过头来阅读。

导入
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外键,将UserArticlePost关联到了一起,最终就是将博客文章的作者和网站的用户关联在一起了。

既然有“一对多”,当然也有“一对一”(OneToOneField)、“多对多”(ManyToManyField)。目前用不到这些外键,后面再回头来对比其差别。

Django2.0 之前的版本外键的on_delete参数可以不填;Django2.0以后on_delete是必填项。

内部类
内部类class Meta提供模型的元数据。元数据是“任何不是字段的东西”,例如排序选项ordering、数据库表名db_table、单数和复数名称verbose_nameverbose_name_plural。这些信息不是某篇文章私有的数据,而是整张表的共同行为。

要不要写内部类是完全可选的,当然有了它可以帮助理解并规范类的行为。

ArticlePost中我们使用的元数据ordering = ('-created',),表明了每当我需要取出文章列表,作为博客首页时,按照-created(即文章创建时间,负号标识倒序)来排列,保证了最新文章永远在最顶部位置。

数据迁移(Migrations)

编写好了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 命令选中所有还没有执行过的迁移并应用在数据库上,也就是将模型的更改同步到数据库结构上。迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表。它专注于使数据库平滑升级而不会丢失数据。

有点拗口,也有点枯燥,坚持。乐趣在后面。

再重复一次:每当你修改了models.py文件,都需要用makemigrationsmigrate这两条指令迁移数据。

在迁移之后,Model的编写就算完成了。

总结

本章初步了解了DjangoMTV模式,编写了博客文章的Model模型ArticlePost,并将其迁移到了数据库中。

下一步就向View进军,学习如何调取模型中的数据。

Django搭建个人博客之编写博客文章的Model模型相关推荐

  1. Django 搭建博客网站-task03:Models的编写

    Django 搭建博客网站 目录 Django 搭建博客网站 前言 一.Models 的编写 二.Blog_config 三.comment 总结 前言 在vscode上连接虚拟机,然后输入命令 bl ...

  2. Django搭建个人博客:用django-notifications实现消息通知

    凭借你勤奋的写作,拜读你文章的用户越来越多,他们的评论也分散在众多的文章之中.作为博主,读者的留言肯定是要都看的:而读者给你留言,自然也希望得到回复. 怎么将未读的留言呈现给正确的用户呢?总不能用户自 ...

  3. Django 搭建博客网站-task02:快速搭建网站

    Django 搭建博客网站 目录 Django 搭建博客网站 前言 一.创建 APP 二.将新建的 APP 和项目进行关联 2.1 修改的文件名是 settings.py 2.2 创建超级管理员 2. ...

  4. Django搭建个人博客(二)

    更换数据表mysql 上文说到编写好了我们的 model 模块,映射生成数据表,之前我们用的是Django 默认的数据库 sqlite3 ,这里我们更改一下使用 mysql. 我们在 navicat ...

  5. Django搭建简易博客教程(四)-Models

    原文链接: http://www.jianshu.com/p/dbc4193b4f95 Django Model 每一个Django Model都继承自django.db.models.Model 在 ...

  6. Django搭建简易博客

    Django简易博客,主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markd ...

  7. django项目转pyc_Python自动化运维系列:Django搭建小博客

    如何使用Django和Python怎么搭建一个小博客呢? 这是一个简单而困难的问题.简单的原因是,只要做过一次,基本上就能做到举一反三: 困难的原因是有没有用心和耐心去完成这个实验. 如果你成功了,那 ...

  8. 10分钟利用django搭建一个博客

    以前老是听说ROR开发有多快多块,网上还有朋友为了证明这,专门制作了10分钟利用rails框架搭建一个简易博客的教程,最近学习django框架,觉得django给开发者的便捷也很多,心血来潮来写个10 ...

  9. django搭建个人博客(一)

    准备阶段 首先熟悉项目的根本流程,下面是对项目的每个模块流程阶段具体分析 模块 功能 注册 图形验证.短信验证 登陆 状态保存.cookie.session 个人中心 图片上传.更新数据 发布博客 数 ...

  10. 新手学习——用django搭建个人博客_day2

    一.模型设计 任何一个产品,最开始应该就是设计数据模型,模型设计好一般就不会轻易去修改它了,但是在此处,我们暂时不考虑用户登录评论这些,只考虑博客展示需要的模型.对应的表应该为以下: 博客:标题 作者 ...

最新文章

  1. 简易嵌入式管理平台 C 实现
  2. Android:展开/折叠动画
  3. WINCE6.0 error C2220: warning treated as error问题解决
  4. zoj 3204 Connect them kruskal
  5. 系统垃圾清理.cmd
  6. java中 flush()方法
  7. java微信学习 接入
  8. 【转】unity开发android游戏(一)搭建Unity安卓开发环境
  9. 判断某点在多边形内——方法一
  10. 关于Navicat 数据库一直激活不成功的解决方法
  11. C语言自学路之验证码
  12. aspx repeate控件多级关联
  13. 机器学习sklearn之支持向量回归(SVR)
  14. 给初学日语者的几点建议——词汇篇
  15. 最新版010editor逆向分析
  16. python编写计算器(图形界面)
  17. 《项目开发团队分配管理软件》
  18. 高等数学——变限积分求导
  19. html 实现音乐的波形,GitHub - wanlixi/html5-audio: 展示html5提供的强大的音频控制API...
  20. 吴恩达机器学习课后作业——神经网络

热门文章

  1. 写给想做互联网产品经理的师弟师妹们一些话
  2. 计算机毕业设计SSM常见病辅助食疗系统【附源码数据库】
  3. destoon调用内容从第几篇开始
  4. push_back和emplace_back区别
  5. Windows 命令提示符
  6. KMP(看毛片)NEXT数组模板
  7. java work stealing_工作窃取(work-stealing)算法
  8. 百度员工离职总结:如何做个好员工?(严重推荐)
  9. python中 三元表达式
  10. 云杰恒指:6.18恒指期货实盘指导交易复盘