本篇博客将会涉及以下内容:
- Django 数据模型的定义
- Django 数据模型的生成和创建
- Django 数据模型的基本使用
1、定义 Django 应用数据模型
在 2020 年的今天,互联网上绝大多数都是根据数据库的数据动态生成内容的 Web 网站。
在 Django 中,通过抽象化模型层(Models)来对数据的处理和操作提供支持。通俗 而言,就是 Django 使用 Models 模型层将原生数据库封装起来,提供一个统一的接口供我们对数据进行操作。
在 Django 项目创建时,Django 就已经默认使用了一个数据库——SQLite 3,这在 settings.py 文件中的 DATABASES 变量中进行声明:
SQLite 3 是一个小巧快速基于文件的数据库,有很好的读写效率但是并不适合并发操 作。如果需要使用其他的数据 库,比如 MySQL,我们在 DATABASES 中填入数据库的连接信息即可:
在我们为项目创建一个 App 时,自动生成的文件中就有一个 models.py 文件,接下 来,在 models.py 文件中创建数据模型。
2、Django 模型结构
因为 Django 的数据模型将原生数据库进行了封装,所以,先来理解一下 Django 的 数据模型及其与数据库之间的关系。
在 Django 中,每个数据模型都对应数据库中的一张数据表,换而言之,一个 Django 数据模型,就是一个数据库表:
- 一个 Django 模型类,大致相当于一个数据库表;
- 一个 Django 模型类的属性,大致相当于数据库表中的一个字段;
- 一个 Django 模型对象,大致相当于数据库表中的一条记录。
每一个模型都继承于 django.db.models.Model 对象,也就是其一个子类:
from django.db import models
class knowledge_qa(models.Model):
pass
模型的每一个属性,都对应于数据表的每一个字段:
from django.db import models
class knowledge_qa(models.Model):
name = models.CharField(max_length=20, verbose_name='名称') #属性
上面这个例子中创建了一个继承于 models.Model 的 knowledge_qa 类,然后在其中定义了一 个 name 属性。按照数据库的说法,则是创建了一个名为knowledge_qa 的数据表,该数据表 中有一个名为 name 的字段。
3、Django 模型字段及选项
对于一个 Django 模型来说,最重要的就是模型的属性,也就是数据库表的字段,其描述和规定的字段数据的属性和内容。
在 Django 模型中,数据字段由 django.db.models 的 fields 类属性来指定,像上面的示例中,使用 models.CharField() 来指定 name 字段的属性为字符类型。Django 模型中定义了很多种字段类型属性,常用的有以下几种。
- CharField():字符串类型字段;
- BooleanField():布尔类型字段;
- DateField():日期类型字段;
- DateTimeField():日期时间类型字段;
- FileField():上传文件类型字段;
- IntegerField():整数型类型字段;
- TextField():大文本类型字段;
- ForeignKey():外键关系类型字段;
- ManyToManyField():多对多关系类型字段。
每一个字段类型都可以接受一组用于定义字段的参数,也就是字段选项,每个字段都会 有一些独有的属性,但也有一些通用的参数,在此介绍一些通用的参数,比如上面示例 中 name 属性中的 verbose_name 参数:
- verbose_name:字段的自述名,用于可读地描述字段;
- null:表示是否允许字段为空,默认为 False。
还有一些仅限于某些字段的属性,比如:
- max_length:字符串类型字段用于限制内容长度的属性;
- auto_now_add:时间相关类型字段中用于自动添加当前时间的属性。
了解了 Django 模型的相关概念,下面为我们的在线视频网站定义模型。
4、定义模型 根据网站规划,网站中将会有以下数据库表:
- 视频分类数据表:存储视频的分类数据;
- 视频详情数据表:存储视频的详细信息;
- 视频标签数据表:存储视频的标签信息;
- 视频专辑数据表:存储视频的所属专辑信息;
- 视频点赞数据表:存储视频的被点赞记录;
- 观看记录数据表:存储视频的观看记录。
借助上面介绍的 Django 数据模型的知识,我们在 models.py 文件中创建五个数据模 型以作为视频数据的容器。
(1)视频分类模型:
在这里创建了一个名为 Cate 的模型类,然后在这个模型类中定义了一个模型字段 name 用于表示视频分类的名称:
class Cate(models.Model):
name = models.CharField(verbose_name="分类名称",max_length=20)
然后重写了模型类的__str__()方法,Django 模型类中的__str__()方法用于返回查询对象的字符串表达式,当模型实例需要强制转换为普通的字符串的时候,都会调用这个方法。默认情况下,__str__()方法会返回对象的字符串,在这里,将返回值改为了 对象的 name 属性的值:
def __str__(self):
return self.name
最后,声明模型的 Meta 类,来指定模型的一些元属性,比如字段的排序方式、数据库的表名、显示的模型字符串等。在此,我们指定了模型的单复数的名称,用于在后台直观的区分不同的数据模型:
class Meta:
verbose_name = '分类名称'
verbose_name_plural = verbose_name
在模型定义中,每一个模型都将重写__str__()方法,以及声明 Meta 类,下面的模 型介绍中就不再一一讲解了。
(2)视频模型
首先,定义了两个功能函数,分别用来指定视频文件的上传路径和视频图片的上传路径。
然后,为视频模型 Video 定义了 11 个模型字段,分别是:
- name:字符串字段,表示视频的名称,最大长度为 20;
- link:文件字段,表示视频文件的路径;
- img:图像字段,表示视频的略缩图;
- passwd:字符串字段,表示视频的观看密码,最大长度为 10,可为空;
- introduce:大文本字段,表示视频的介绍;
- cate:外键字段,表示视频所属的分类;
- hour:字符串字段,表示视频的时长,最大长度为 10;
- views:整数型字段,表示视频的观看次数,默认为 0;
- create_time:日期时间字段,表示视频的创建日期时间,使用 auto_now_add 属性进行自动添加,用于后台记录;
- create_date:日期字段,表示视频的创建日期,使用 auto_now_add 属性自动 添加,用于前段页面展示;
- status:字符串字段,表示视频的状态,分为上线和下线。
接着重写了模型的__str__()方法和声明了 Meta 类。
(3)视频标签模型
在标签模型 Label 中,我们定义了两个模型字段,一个外键字段 Video,链到 Video 模型;一个字符串字段 label 表示标签的名称。
(4)视频专辑模型
与视频标签模型 Label 类似,视频专辑模型也定义了一个外键字段链接到 Video 模 型,一个字符串字段表示视频专辑的名称。
(5)视频点赞模型
在点赞模型中,我们创建了三个字段:
- video:外键字段,链接到 Video 模型;
- user:外键字段,链接到用户模型 User;
- time:日期时间字段,用于自动记录用户对视频点赞的时间。
等等,我们好像并没有创建一个名为 User 的用户模型,怎么能够进行外键引用呢?
原因在于,在 models.py 文件的头部,引入了 Django 认证系统中的 User 类,这个 User 类就是 Django 认证系统中的用户模型:
Django 从安装好之后就带有一个用户认证系统,用于处理用户的账号、权限和会话。
在使用 django-admin startproject 命令创建了项目后,Django 会默认为项目添加认证 系统相关的组件和中间件,这在 settings.py 中可以直观的看到,settings.py 文件中 INSTALLED_APPS 列表:
django.contrib.auth 模块包含了 Django 认证系统的核心和默认模型,我们使用的 User 模型就是出自这个模块。
(6)观看历史模型
与点赞模型类似,观看历史模型 History 也有三个字段:
- video:外键字段,链接到 Video 模型;
- user:外键字段,链接到用户模型 User;
- view_date:日期时间字段,用于自动记录用户观看视频的时间。
这样,6 个数据模型我们就已经定义好了,接下来对定义好的模型进行生成。
5、生成模型
在定义好数据模型之后,借助 manage.py 提供的功能,对数据模型进行生成和迁移。
首先,使用 makemigrations 命令检测数据模型(models.py)的变化并为此创建新的 迁移:
python manage.py makemigrations video
首先要导入Pillow三方库:
运行上述命令,Django 将会检测到video应用中 models.py 文件中所作出的变动, 然后生成新的数据迁移文件,如下图所示:
上图显示,本次的迁移文件 0001_initial.py 中一共创建了 10 个动作,其中 6 个为 数据表的创建,4 个为数据字段的添加:
- 创建视频分类 Cate 表
- 创建视频观看历史 History 表
- 创建视频标签 Label 表
- 创建视频点赞 Likes 表
- 创建视频专辑 Set 表
- 创建视频信息 Video 表
- 添加 video 字段到专辑表
- 添加 video 字段到点赞表
- 添加 video 字段到标签表
- 添加 video 字段到历史表
确保信息无误后,继续使用 migrate 命令,在数据库中同步这些数据迁移:
python manage.py migrate
运行上述命令后,Django 将会在数据库中执行通过 makemigrations 创建的数据迁 移,结果如下图所示:
上图显示执行迁移文件 0001_initial 成功,这样数据库中就已经创建好在 models.py 文件中定义的数据模型了。