Django Web开发(day3)——创建网站数据模型(数据库篇)

本篇博客将会涉及以下内容: 

  • 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 文件中定义的数据模型了。 

发布了66 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yansky58685/article/details/104253287
今日推荐