Python + Django4 搭建个人博客(六): 数据库表和模型设计

目录

数据库表设计

数据模型定义

数据模型说明

模块导入

字段

数据迁移(Migrations)

结语


上篇我们已经提到,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文件,该文件存放在Articlemigrations文件夹,打开查看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代表着这个表是由名为articleapp根据模型创建的article表,它对应的就是models.py 里面的article模型类。

其他数据表是Django内置功能所使用的数据表,分别是会话session、用户认证管理和Admin日志记录等。

至此,我们完成了我们的第一个模型Article用于管理文章。

结语

本篇我们根据博客网站系统架构,我们预定义了两个表,博客文章表:Article,评论表:Comment 。

以博客文章表为例,在models.py文件中我们定义了Article的模型类。

同时根据模型定义字段,利用Manage.py 工具的指令makemigrationsmigrate将其迁移到了MySQL数据库中。

下篇,我们将学习下django强大的后台管理工具,admin后台系统,利用后台系统,我们可以直接更新数据库的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值