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

目录

数据库表设计

数据模型定义

数据模型说明

模块导入

字段

数据迁移(Migrations)

结语


上篇我们已经提到,Django是通过模型来对应实体数据库,然后通过ORM来实现对实体数据库的修改。

本文我们就来设计一个文章管理的表,同时利用Django模型来自动在Mysql数据库中生成文章表。

根据我们前面的系统功能设计,我们需要进行存储和管理的数据包括用户,文章和评论。

  • 博客文章表:Article
  • 评论表:Comment

用户管理功能实现我们直接基于Django自带的用户及认证模块,这部分表Django会自动创建,暂时我们无需处理(后面我们到用户管理模块的时候会专门处理)。

本篇我们先实现文章管理的表。

以文章数据表的设计和创建,我们从整体上熟悉下Django是如何通过模型对实体数据库进行操作,同时也初步熟悉下Django模型的的语法结构。

数据库表设计

文章是博客最主要的数据,所以我们先定义一个存储文章的表。

定义个数据表名: Article

相关的数据字段列表和数据格式要求和说明如下:

字段名

数据类型

是否主键

说明

author

int

文章作者

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):
    # 文章作者 ,参数 on_delete 用于指定数据删除的方式
    author = models.CharField(max_length=100, primary_key=True)

    # 文章标题,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后台系统,利用后台系统,我们可以直接更新数据库的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340