目录
上篇我们已经提到,Django是通过模型来对应实体数据库,然后通过ORM来实现对实体数据库的修改。
本文我们就来设计一个文章管理的表,同时利用Django模型来自动在Mysql数据库中生成文章表。
根据我们前面的系统功能设计,我们需要进行存储和管理的数据包括用户,文章和评论。
- 博客文章表:Article
- 评论表:Comment
用户管理功能实现我们直接基于Django自带的用户及认证模块,这部分表Django会自动创建,暂时我们无需处理(后面我们到用户管理模块的时候会专门处理)。
本篇我们先实现文章管理的表。
以文章数据表的设计和创建,我们从整体上熟悉下Django是如何通过模型对实体数据库进行操作,同时也初步熟悉下Django模型的的语法结构。
数据库表设计
文章是博客最主要的数据,所以我们先定义一个存储文章的表。
定义个数据表名: Article
相关的数据字段列表和数据格式要求和说明如下:
字段名 | 数据类型 | 是否主键 | 说明 |
id | int | 是 | 文章id |
author | varchar(100) | 否 | 文章作者 |
title | varchar(100) | 否 | 文章标题 |
body | Text | 否 | 文章正文 |
created | DateTime | 否 | 文章创建时间 |
updated | DateTime | 否 | 文章更新时间 |
数据模型定义
Django中通过模型(Model)映射到数据库,处理与数据相关的事务。
Django的模型都是通过Python语法定义的,所以我们在利用Django开发的时候,理论上我们可以不用特意去学习SQL语句(当然最好还是学习下),就可以完成Web应用的开发。
我们在使用Django进行web开发的时候最好还是直接通过模型来创建数据表,因为Django对模型和目标数据库之间有自身的映射规则,如果自己在数据库中创建数据表,可能不一定符合Django的建表规则,从而导致模型和目标数据库无法建立通信联系。
Django定义模型是需要在App下面的 models.py 中完成。
我们打开 article
下面的models.py
文件,输入如下代码,定义一个名为Article的数据模型:
from django.db import models
# 导入内建的User模型。
from django.contrib.auth.models import User
# timezone 用于处理时间相关事务。
from django.utils import timezone
# 博客文章数据模型
class Article(models.Model):
# 文章id,主键
id = models.AutoField(primary_key=True)
# 文章作者 ,用于指定数据删除的方式
author = models.CharField(max_length=100)
# 文章标题,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的
models.Model
类,一个类代表目标数据库的一张数据表,类的命名一般以首字母大写开头。 - 模型的字段以类属性进行定义,如
author = models.CharField(max_length=100, primary_key=True)
代表在数据表Article
中命名一个名为author
的字段,该字段的数据类型为整型并设置为主键。 - 每个字段都是
Field
类的实例 。比如字符字段被表示为CharField
,日期时间字段被表示为DateTimeField
。这将告诉Django要处理的数据类型。 - 定义某些
Field
类实例需要参数。例如CharField
需要一个max_length
参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据。
数据模型说明
上面定义模型的代码中涉及部分Python的知识点,这里我们也特别说明下(这一块暂时不想看也可以先跳过,带熟悉了Python之后回来阅读会很容易理解)。
模块导入
Django框架基于python语言,而在python中用import
或者from...import
来导入模块。
模块其实就一些函数和类的集合文件,它能实现一些相应的功能。
当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中就可以使用了。
import
用于导入整个功能模块。但实际使用时往往只需要用模块中的某一个功能,为此导入整个模块有点大材小用,因此可以用from a import b
表示从模块a中导入b给我用就可以了。
类
Python作为面向对象编程语言,最重要的概念就是类(Class)和实例(Instance)。
类是抽象的模板,而实例是根据这个类创建出来的一个个具体的“对象”。每个对象都拥有相同的方法,但各自的数据可能不同。而这些方法被打包封装在一起,就组成了类。
在Django中,数据由模型来处理,而模型的载体就是类(Class)。
比如我们定义的上文代码中class Article(models.Model):
定义的Article 就是一个代表为文章的类 。
字段
字段(field)表示数据库表的一个抽象类,Django使用字段类创建数据库表,并将Python类型映射到数据库。
在模型中,字段被实例化为类属性并表示特定的表,同时具有将字段值映射到数据库的属性及方法。
比方说Article类中有一个title
的属性,这个属性中保存着Charfield
类型的数据:即一个较短的字符串。
数据迁移(Migrations)
完成模型的定义后,接着在目标数据库中创建相应的数据表,这个步骤在Django中叫做数据迁移。
注意,每当对数据库进行了更改(添加、修改、删除等)操作,都需要进行数据迁移。
jango的迁移代码是由模型文件自动生成的,它本质上只是个历史记录,Django可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。
在目标数据库中创建表(数据迁移)可以通过Django的管理工具使用特定的代码指令完成。
在目标数据库中创建数据表需要执行两次指令,分别是makemigrations和migrate指令。
python manage.py makemigrations
python manage.py migrate
创建过程说明如下:
makemigrations
指令用于将Article
所定义的模型生成0001_initial.py
文件,该文件存放在Article
的migrations
文件夹,打开查看0001_initial.py
文件。
# Generated by Django 4.1 on 2022-08-24 07:57
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Article',
fields=[
('author', models.CharField(max_length=100, primary_key=True, serialize=False)),
('title', models.CharField(max_length=100)),
('body', models.TextField()),
('created', models.DateTimeField(default=django.utils.timezone.now)),
('updated', models.DateTimeField(auto_now=True)),
],
),
]
可以看到0001_initial.py
文件实际上就是根据models.py
的内容生成数据表的脚本代码。
而migrate
指令根据脚本代码在目标数据库中生成相对应的数据表。
指令运行完成后,可在数据库看到已创建的数据表。
上述数据库中的表article_article
代表着这个表是由名为article
的app
根据模型创建的article
表,它对应的就是models.py
里面的article
模型类。
其他数据表是Django内置功能所使用的数据表,分别是会话session、用户认证管理和Admin日志记录等。
至此,我们完成了我们的第一个模型Article
用于管理文章。
结语
本篇我们根据博客网站系统架构,我们预定义了两个表,博客文章表:Article,评论表:Comment 。
以博客文章表为例,在models.py文件中我们定义了Article
的模型类。
同时根据模型定义字段,利用Manage.py
工具的指令makemigrations
和migrate
将其迁移到了MySQL数据库中。
下篇,我们将学习下django强大的后台管理工具,admin后台系统,利用后台系统,我们可以直接更新数据库的内容。