百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

「原创」Django第五章、模型建立与迁移

toyiye 2024-09-16 06:09 3 浏览 0 评论

20大进阶架构专题每日送达

模型建立与迁移

回顾

上一章中,我们介绍了模型层的基本结构和基本字段。这一章,到了该动手的时候了,我们将创建一个自己写的数据模型类,那么我们写啥呢?别忘了,在介绍Django特点的时候,我们知道Django适合做内容,所以基于此特点,我们编写一个博客岂不乐哉。毕竟博客中最需要的就是文章嘛,好,闲话少叙,我们开始。

模型的建立

我们要建立一个博客系统,我们回顾前面所学知识,重新建立一个Django项目名字为myblog,在命令行敲如下命令:

python manage.py startproject myblog

然后在manage.py所在目录下,用命令 python manage.py startapp blog新建一个blog应用,然后在 ./blog/models.py 中写一个类,命名为BlogArticles。

通过这个类我们可以创建一个专门用来保存博客文章的数据库表,代码如下:

from django.db import models
from django.utils import timezone # 新增
from django.contrib.auth.models import User# 新增


# Create your models here.
# 编写博客的数据类型类BlogArticles
class BlogArticles(models.Model):
# 字段title的属性为CharField类型,并且以参数max_length=300说明字段的最大数量
title = models.CharField(max_length=300)
# 一个用户对应多篇文章,级联删除
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
body = models.TextField
publish = models.DateTimeField(default=timezone.now)

class Meta:
ordering = ("-publish", ) # 规定了BlogArticles实例对象的显示顺序,即按照publish字段值的倒序显示

def __str__(self):
return self.title

相信经过上一章的介绍,这里很多面孔你都很熟悉,现在对他们进行简单介绍:

  • timezone模块,我们未来记录文章发布时间,所以导入了这个模块。但因为Django默认开启时区且为UTC,所以需要在 settings.py中进行如下设置:

TIME_ZONE = 'Asia/Shanghai' # 设置东八区时间
# TIME_ZONE = 'UTC'
USE_TZ = False
  • User模型被命名为内置应用叫auth,它以命名空间django.contrib.auth的形式出现在INSTALL_APPS配置中

  • ForeignKey反映出一个用户可以发表多篇文章,其中参数on_delete=models.CASCADE是数据库中的“级联删除”,如果“用户表”中的某个用户被删除,那么“文章表”中该用户对应的文章记录也将被删除。另一个参数related_name="blog_posts"的作用是允许User的实例(某个用户名)以“blog_posts”属性反向查询到类BlogArticles的实例。

  • 我们还定义了Meta子类,使用了ordering = ("-publish", )规定文章的显示顺序

  • __str__方法是对象的字符串表示形式。我们可以使用版块的名称来表示它。

以上步骤我们还是仅仅在我们创建blog应用中写了一个博客文章模型,如果想要让应用生效。

我们还需要将应用配置到我们的settings当中去,在settings.py文件的INSTALLED_APPS列表中添加blog应用,如下所示:

到这一步,我们的BlogArticles类的数据模型编写完毕,对应的数据库表就是通过这个类中各字段和属性创建完成。

数据迁移

下一步就是告诉Django,我的模型类创建好了,该到你创建数据库了,我们打开终端,转到manage.py文件所在的文件夹,然后运行一下命令:

python manage.py makemigrations

然后你将看到如下输出内容:

Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model BlogArticles

此时,Django在/blog/migrations目录中创建了一个名为0001_initial.py的文件。它代表了应用程序模型的当前状态,在下一步,将使用该文件创建表和列。

迁移文件将被翻译成SQL语句。执行下面命令:

 python manage.py sqlmigrate blog 0001

然后可以看到如下输出内容:

BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT , "body" text NOT , "publish" datetime NOT , "author_id" integer NOT REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;

最后我们将生产的迁移文件应用到数据库中:

 python manage.py migrate

当看到

Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying blog.0001_initial... OK
Applying sessions.0001_initial... OK

Applying sessions.001_initial... OK,这是我们在上一步生产的迁移脚本。意味着,我们的数据库已经可以开始使用了。

Django自带一个数据库SQLite,需要注意的是SQLite是一个产品级数据库。SQLite被许多公司用于成千上万的产品,如所有Android和iOS设备,主流的Web浏览器,Windows 10,MacOS等。但这不适合所有情况。SQLite不能与MySQL,PostgreSQL或Oracle等数据库进行比较。大容量的网站,密集型写入的应用程序,大的数据集,高并发性的应用使用SQLite最终都会导致问题。

SQLite很轻量级,但是并不影响我们用来学习,接下来我们将利用命令行工具来对模型进行操作,也就是我们学习过数据库的基本操作——增、删、改、查。

下一章再见!

———— e n d ————

微服务、高并发、JVM调优、面试专栏20大进阶架构师专题请关注公众号Java进阶架构师】后在菜单栏查看。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码