Django开发--step2 数据库操作

2024-01-10 01:58

本文主要是介绍Django开发--step2 数据库操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、博客系统数据库设计
博客文章表
1. ID  | 标题   | 正文  |  发表时间   | 分类  |  标签
2. ID  | 分类名
3. ID  | 标签名
表中最起码有这些内容

二、编写博客模型代码
例如我们的分类数据库表,Django 只要求我们这样写:

blogapp/models.py

from django.db import modelsclass Category(models.Model):name = models.CharField(max_length=100)


Category 就是一个标准的 Python 类,它继承了 models.Model 类,类名为 Category 。Category 类有一个属性 name,它是 models.CharField 的一个实例。

这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name。还有一个列 id,Django 则会自动创建。可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。

上述操作数据库的方法叫做ORM,是django设计的一套python对象与数据库的映射系统,使得开发者可以不用SQL语句就能实现及其复杂的数据库操作,ORM框架为每个表对应的类都生成了objects对象(如果你没有显式指定表的Manager的话),而这个objects对象拥有操作表的所有方法,诸如批量查询filter、单次查询get、更新update等。所以当我们执行SQL操作时,比如查询整表,可以如下:

articles = Article.objects.all()

上述代码返回了表中的所有行,注意在代码中:

  • ForeignKey: 一对多, 将该属性定义到多的那一端
  • OneToOneField: 一对一, 将该属性定义到任一端
  • ManyToManyField: 多对多, (将该属性定义到两端),多对多关系会自动生成一张表

 

三、Django完成翻译-迁移数据库

以上我们编写的知识python代码,django还没有把它翻译为数据库语言,因此数据库表还没有在真正的数据库中创建

什么是数据库迁移?
当我们在看关于web开发的教程时,教程在设计数据表时,不是一下子就设计好的,而是先设计一个能用的数据表,然后再慢慢的往里面增加东西。当我们往表里面增加东西时,比如说增加一个字段,那么之前的数据怎么办?
这时候就要用到数据库迁移了,在数据表进行更新时,可以利用数据库迁移脚本在当前数据表进行更新,而不是重新创建一个数据表。

在django中的数据库迁移需要前后执行两个命令:

python manage.py makemigrations

   和  

 python manage.py migrate

执行第一个命令---》生成迁移文件

执行第二个命令---》生成数据库表

当我们执行了 python manage.py makemigrations 后,Django 在 blog 应用的 migrations\ 目录下生成了一个 0001_initial.py 文件,这个文件是 Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py 文件里创建了 3 个模型类,Django 把这些变化记录在了 0001_initial.py 里。

不过此时还只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。Django 通过检测应用中 migrations\ 目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。

你可以看到命令的输出除了 Applying blog.0001_initial... OK 外,Django 还对其它文件做了操作。这是因为除了我们自己建立的 blog 应用外,Django 自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在 settings.py 的 INSTALLED_APP 设置里看到这些应用,当然我们目前不必关心这些。

只要模型类涉及到结构改变都要重新执行两个迁移命令

当我们执行 :::

python manage.py sqlmigrate blogapp 0001

可以看到django究竟为我们做了什么

BEGIN;
--
-- Create model Category
--
CREATE TABLE "blogapp_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL);
--
-- Create model Post
--
CREATE TABLE "blogapp_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(70) NOT NULL, "body" text NOT NULL, "created_time" datetime NOT NULL,"modified_time" datetime NOT NULL, "excerpt" varchar(200) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"), "category_id" integer NOT NULL REF
ERENCES "blogapp_category" ("id"));
--
-- Create model Tag
--
CREATE TABLE "blogapp_tag" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL);
--
-- Add field tags to post
--
CREATE TABLE "blogapp_post_tags" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "post_id" integer NOT NULL REFERENCES "blogapp_post" ("id"), "tag_id" integer NO
T NULL REFERENCES "blogapp_tag" ("id"));
CREATE INDEX "blogapp_post_4f331e2f" ON "blogapp_post" ("author_id");
CREATE INDEX "blogapp_post_b583a629" ON "blogapp_post" ("category_id");
CREATE UNIQUE INDEX "blogapp_post_tags_post_id_3c6dd183_uniq" ON "blogapp_post_tags" ("post_id", "tag_id");
CREATE INDEX "blogapp_post_tags_f3aa1999" ON "blogapp_post_tags" ("post_id");
CREATE INDEX "blogapp_post_tags_76f094bc" ON "blogapp_post_tags" ("tag_id");
COMMIT;

sqlite和mysql数据库的区别  本项目使用的是sqlite3 ,在项目的根目录下显示有数据库 db.sqlite3

 

四、用django的方式操作数据库

对数据库的操作无非是增删改查

(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
# 增加数据
>>> from blogapp.models import Category, Tag, Post
>>> c=Category(name='category test')
>>> c.save()
>>> t=Tag(name='tag test')
>>> t.save()
>>> quit()# 创建用户
(blog_venv) D:\python_study2019\blog>python manage.py createsuperuser
Username (leave blank to use 'dell'): slyslyme
Email address: slyslyme@163.com
Password:
Password (again):
Superuser created successfully.(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Category, Tag, Post
Traceback (most recent call last):File "<console>", line 1, in <module>
ModuleNotFoundError: No module named 'blog.models'
>>> from blogapp.models import Category, Tag, Post
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User
>>> user=User.objects.get(username='slyslyme')
>>> c=Category.objects.get(name='category test')
>>> p=Post(title='title test',body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
>>> p.save()
>>> Category.objects.all()
<QuerySet [<Category: Category object>]>然后在三个模型代码中各添加了def __str__(self):return self.namenow exiting InteractiveConsole...(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)# 查询全部
>>> from blogapp.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]>
>>> Tag.objects.all()
<QuerySet [<Tag: tag test>]># 修改数据
>>> c=Category.objects.get(name='category test')
>>> c.name='category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: category test new>]>
>>> c=Category(name='category test')
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: category test new>, <Category: category test>]># 删除数据
>>> c=Category.objects.get(name='category test new')
>>> c
<Category: category test new>
>>> c.delete()
(2, {'blogapp.Post_tags': 0, 'blogapp.Post': 1, 'blogapp.Category': 1})
>>> Category.objects.all()
<QuerySet [<Category: category test>]>

 

若在运行时报错

    category = models.ForeignKey(Category)
TypeError: __init__() missing 1 required positional argument: 'on_delete'


则将外键修改为

category = models.ForeignKey(Category,on_delete=models.CASCADE)

这篇关于Django开发--step2 数据库操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589167

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成