【Django 网页Web开发】05. 数据库操作,实战用户管理(保姆级图文)

news/2024/5/14 11:45:11/文章来源:https://blog.csdn.net/u011027547/article/details/129518781

目录

  • 1. 安装第三方模块
  • 2. ORM
    • 2.1 自己手动创建数据库
    • 2.2 django连接数据库
    • 2.3 建表语句写在哪里?
    • 2.4 建表语句写好后如何运行生效?
  • 3. 操作表
    • 3.1 创建数据表
    • 3.2 修改数据表
  • 4. 操作数据
    • 4.1 插入数据
    • 4.2 删除数据
    • 4.3 修改数据
    • 4.4 查询数据
  • 5. 实战:用户管理
    • 5.1 用户展示
    • 5.2 用户添加
    • 5.3 用户删除
    • 总结


欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中

1. 安装第三方模块

pip install mysqlclient

在这里插入图片描述


2. ORM

ORM功能:

  • 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】

  • 操作表中的数据(不用写SQL语句)。

简单来说,ORM可以理解为普通话 ,sql语句是方言,ORM是一种sql语句的翻译,主要缺点是不能创建数据库,优点是书写起来简单高效。(运行效率不保证)

2.1 自己手动创建数据库

  • 启动MySQL服务

  • 自带工具创建数据库

    • 使用命令行创建
      先mysql登录
      然后输入命令
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 使用navicat等工具创建(注意创建数据库字符集 排列规则)
    在这里插入图片描述

2.2 django连接数据库

在项目的setting.py中修改数据库配置DATABASES

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 驱动'NAME': 'day15',  # 数据库名字'USER': 'root',  # mysql用户名'PASSWORD': '123456',  # mysql密码'HOST': '127.0.0.1',  # 本机安装了MySQL'PORT': 3306,  # 端口}
}

在这里插入图片描述

2.3 建表语句写在哪里?

所有的操作都需要在已经注册的app中的moudle.py中编写ORM语句,如下图app01就是已经注册好的,编写其中的moudle.py
在这里插入图片描述

2.4 建表语句写好后如何运行生效?

在项目根目录(根目录下有一个manage.py的文件,在最外层)下cmd执行下方代码,按照注册的app顺序从上到下依次执行各个app的moudle.py文件。

python manage.py makemigrations
python manage.py migrate
  • makemigrations说明:
  • 记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件,相当于一个缓冲改动,但是此时不会真的影响我们的数据库。
  • 作用区域:所有app
python manage.py makemigrations

执行成功后出现文件夹内容:
在这里插入图片描述

  • migrate 说明:
  • 这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性
  • 作用区域:所有app
python manage.py migrate
  • 如果要想仅仅对部分app进行作用的话 则执行如下命令:
python manage.py makemigrations appname
python manage.py migrate appname
  • 如果要想精确到某一个迁移文件则可以使用:
python manage.py migrate appname 文件名

3. 操作表

注意,我们的app注册列表默认有很多官方默认的app,因此第一次操作数据库也会生成很多官方内置的表,我们学习时只需要关注自己新建的表即可。
在这里插入图片描述

3.1 创建数据表

  • moudle.py内容
from django.db import modelsclass UserInfo(models.Model):#一个类就是一个表name = models.CharField(max_length=32)password = models.CharField(max_length=64)
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo`  (
#   `id` bigint NOT NULL AUTO_INCREMENT,
#   `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   PRIMARY KEY (`id`) USING BTREE
# )

在这里插入图片描述
观察新建的表,默认给我们添加一个id主键
在这里插入图片描述

3.2 修改数据表

在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:

  • 1,手动输入一个值。

  • 设置默认值

    age = models.IntegerField(default=2)
    
  • 允许为空

    data = models.IntegerField(null=True, blank=True)
    
  • moudle.py内容

from django.db import modelsclass UserInfo(models.Model):#一个类就是一个表name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(default=2)#新增了这一列
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo`  (
#   `id` bigint NOT NULL AUTO_INCREMENT,
#   `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `age` int NOT NULL,
#   PRIMARY KEY (`id`) USING BTREE
# )

在这里插入图片描述


4. 操作数据

4.1 插入数据

先新建一个部门表,然后再执行插入数据,不然会报错不存在部门表,这一步要分开来操作两次。

  • moudle.py内容
from django.db import modelsclass UserInfo(models.Model):#一个类就是一个表name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(default=2)#新增了这一列class Department(models.Model):# 新建一个部门类title = models.CharField(max_length=16)#部门名称

-执行cmd命令建表后
在这里插入图片描述

  • moudle.py内容
from django.db import modelsclass UserInfo(models.Model):#一个类就是一个表name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(default=2)#新增了这一列class Department(models.Model):# 新建一个部门类title = models.CharField(max_length=16)#部门名称# #### 1.插入数据 ####
Department.objects.create(title="销售部")
Department.objects.create(title="IT部")
Department.objects.create(title="运营部")
UserInfo.objects.create(name="武沛齐", password="123", age=19)
UserInfo.objects.create(name="朱虎飞", password="666", age=29)
UserInfo.objects.create(name="吴阳军", password="666")

在这里插入图片描述

4.2 删除数据

一般情况下,建议新建一个orm网页用于快速测试,避免繁琐的使用命令行,这样只需要打开orm即可执行语句
在这里插入图片描述
在这里插入图片描述
这里注意,不能在moudle.py中删除数据,会报错django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 原因未知。
在这里插入图片描述

  • view.py内容
    在这里插入图片描述
from app01.models import Department, UserInfo
def orm(request):# #### 2.删除 ####UserInfo.objects.filter(id=3).delete()Department.objects.all().delete()return HttpResponse("成功")

在这里插入图片描述

4.3 修改数据

在这里插入图片描述

  • moudle.py核心内容
# #### 3.修改数据 ####
UserInfo.objects.all().update(password=999)#把所有人的密码改为999
UserInfo.objects.filter(id=2).update(age=999)#把id为2的记录的年纪改为999
UserInfo.objects.filter(name="朱虎飞").update(age=999)#把name为朱虎飞的记录年纪改为999

4.4 查询数据

  • moudle.py内容
from django.db import modelsclass UserInfo(models.Model):#一个类就是一个表name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(default=2)#新增了这一列class Department(models.Model):# 新建一个部门类title = models.CharField(max_length=16)#部门名称# #### 4.查询数据 ####
# 4.1 获取符合条件的所有数据
# data_list = [对象,对象,对象]  QuerySet类型
data_list = UserInfo.objects.all()#一个数据列表
print("遍历打印所有")
for obj in data_list:#print(obj.id, obj.name, obj.password, obj.age)#data_list = [对象,]
data_list = UserInfo.objects.filter(id=1)
print(data_list)#打印第一条
#4.2 获取第一条数据【对象】
row_obj = UserInfo.objects.filter(id=1).first()
print("打印row_obj的各列数据")
print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)

在这里插入图片描述


5. 实战:用户管理

url.py 添加url

    # 案例:用户管理path('info/list/', views.info_list),#展示用户列表path('info/add/', views.info_add),#添加用户path('info/delete/', views.info_delete),#删除用户

5.1 用户展示

  • view.py 获取数据并返回data_list
def info_list(request):# 1.获取数据库中所有的用户信息# [对象,对象,对象]data_list = UserInfo.objects.all()# 2.渲染,返回给用户return render(request, "info_list.html", {"data_list": data_list})
  • info_list.html 内容
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>INFO列表</h1><table border="1"><thead><tr><th>ID</th><th>姓名</th><th>密码</th><th>年龄</th><th>操作</th></tr></thead><tbody>{% for obj in data_list %}<tr><td>{{ obj.id }}</td><td>{{ obj.name }}</td><td>{{ obj.password }}</td><td>{{ obj.age }}</td></tr>{% endfor %}</tbody>
</table></body>
</html>

在这里插入图片描述

5.2 用户添加

修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/add/">添加</a>,用于跳转到用户添加页面

  • info_list.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>INFO列表</h1><a href="/info/add/">添加</a><table border="1"><thead><tr><th>ID</th><th>姓名</th><th>密码</th><th>年龄</th><th>操作</th></tr></thead><tbody>{% for obj in data_list %}<tr><td>{{ obj.id }}</td><td>{{ obj.name }}</td><td>{{ obj.password }}</td><td>{{ obj.age }}</td></tr>{% endfor %}</tbody>
</table></body>
</html>

在这里插入图片描述

  • view.py 获取表单传来的值,并将之写入数据库后跳转回到用户展示列表
def info_add(request):if request.method == "GET":return render(request, 'info_add.html')# 获取用户提交的数据user = request.POST.get("user")pwd = request.POST.get("pwd")age = request.POST.get("age")# 添加到数据库UserInfo.objects.create(name=user, password=pwd, age=age)# 自动跳转# return redirect("http://127.0.0.1:8000/info/list/")return redirect("/info/list/")#上一行写法的简化
  • info_add.html 内容
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post">{% csrf_token %} {# 注意不要忘了csrf!!! #}<input type="text" name="user" placeholder="用户名"><input type="text" name="pwd" placeholder="密码"><input type="text" name="age" placeholder="年龄"><input type="submit" value="提交">
</form></body>
</html>

在这里插入图片描述

5.3 用户删除

修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/delete/?nid={{ obj.id }}">删除</a>,用于删除用户

  • info_list.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>INFO列表</h1><a href="/info/add/">添加</a><table border="1"><thead><tr><th>ID</th><th>姓名</th><th>密码</th><th>年龄</th><th>操作</th></tr></thead><tbody>{% for obj in data_list %}<tr><td>{{ obj.id }}</td><td>{{ obj.name }}</td><td>{{ obj.password }}</td><td>{{ obj.age }}</td><td><a href="/info/delete/?nid={{ obj.id }}">删除</a></td></tr>{% endfor %}</tbody>
</table></body>
</html>

在这里插入图片描述

  • view.py
# http://127.0.0.1:8000/info/delete/?nid=1
# http://127.0.0.1:8000/info/delete/?nid=2
# http://127.0.0.1:8000/info/delete/?nid=3
def info_delete(request):nid = request.GET.get('nid')#获取get传来的idUserInfo.objects.filter(id=nid).delete()#根据指定id删除return redirect("/info/list/")#跳转回到用户列表页面

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python 网页Web开发知识!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中
『01. 安装配置Django』
『02. 创建并运行一个Django项目』
『03. 初识Django』
『04. 请求和响应,网页跳转重定向,实战简易表单模拟登陆』
『05. 数据库操作,实战用户管理』
『06. 报错:You have 26 unapplied migration(s). Your project may not work properly until you apply the migra』
『07. 模板语法』
『08. 实战项目:部门和员工管理系统(01)』
『09. 实战项目:员工编辑删除功能与靓号管理(02)』
『10. 实战项目:靓号搜索功能(03)』
『11. 实战项目:分页与页码跳转功能(04)』
『12. 实战项目:分页组件的封装 面向接口编程(05)』
『13. 实战项目:添加用户时的时间选择组件(06)』
『14. 实战项目:一些面向对象的代码结构优化(07)』
『15. 实战项目:管理员增删改查,md5密码和密码重置(08)』
『16. 实战项目:BootStrap类的进一步优化(09)』
『17. 实战项目:login业务涉及cookie、session、中间件(10)』
『18. 实战项目:登录时的验证码(11)』
『19. 实战项目:初识Ajax请求(12)』
『20. 实战项目:Ajax实战之订单管理与弹出对话框(13)』
『21. 实战项目:echart数据图表(14)』
『22. 实战项目:简单的文件上传(15)』
『23. 实战项目:Excel和form和moudleForm的文件上传(16)』
【更多内容敬请期待】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_273935.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest学习和使用22-allure特性 丨总览中的Environment、Categories设置以及Flaky test使用

22-allure特性 丨总览中的Environment和Categories设置1 Environment设置1.1 设置方法1.2 创建文件2 Categories设置2.1 设置方式2.2 创建文件3 关于Flaky test3.1 Flaky test介绍3.2 产生Flaky Tests的原因3.3 Flaky安装3.4 Flaky使用3.5 小结小结1小结2如下图&#xff0c;我们…

开始学习HTML5

HTML5 简介 HTML5是HTML最新的修订版本&#xff0c;2014年10月由万维网联盟&#xff08;W3C&#xff09;完成标准制定。 HTML5的设计目的是为了在移动设备上支持多媒体。 HTML5简单易学。 什么是 HTML5? HTML5 是下一代 HTML 标准。 HTML , HTML 4.01的上一个版本诞生于 1…

如何将3张图片横向拼在一起

如何将3张图片横向拼在一起&#xff1f;遇到这个情况你可能马上就会说出很多图片处理的app&#xff0c;比如用某秀秀来操作&#xff0c;但是也有很多时候某秀秀也处理不了的。当我们的图片非常大&#xff0c;图片数量很多&#xff0c;图片的格式不是jpg那种通用的格式&#xff…

如何监控和诊断JVM堆内和堆外内存使用?

第26讲 | 如何监控和诊断JVM堆内和堆外内存使用&#xff1f; 上一讲我介绍了 JVM 内存区域的划分&#xff0c;总结了相关的一些概念&#xff0c;今天我将结合 JVM 参数、工具等方面&#xff0c;进一步分析 JVM 内存结构&#xff0c;包括外部资料相对较少的堆外部分。 今天我要…

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好&#xff0c;我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解&#xff01;&#x1f600; 继上一个讲完的栈后&…

视听场景理解经典任务

文章目录1. 视听场景理解简介2. 主要任务2.1 Audio-visual Event Localization (AVE) 2.2 Audio-visual Video Parsing &#xff08;AVVP&#xff09;2.3 Audio-visual Question Answering &#xff08;AVQA&#xff09;2.4 Audio-visual Segmentation &#xff08;AVS&#xf…

STM32中systick中断的优先级

1、systick中断的优先级 systick为内核外设中断&#xff0c;与普通外设中断的优先级有些区别&#xff0c;并没有抢占优先级和子优先级的说法。 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器&#xff1a;SHPRx&#xff08;x1.2.3&#xff09;来配置。 内核外设的中…

佳明安夺(Garmin Enduro)续航简单测试

文章目录&#xff08;一&#xff09;结论&#xff08;二&#xff09;测试条件&#xff08;2.1&#xff09;Garmin Connect APP 日历&#xff08;2.2&#xff09;具体运动记录&#xff08;2.3&#xff09;步数情况&#xff08;三&#xff09;补充和探讨&#xff08;3.1&#xff…

信捷PLC通过EtherCat与松下伺服通讯时的断电重启时会产生巨大异响的Bug原因及解决办法

信捷PLC支持ethercat通讯协议,可以和支持ethercat的从站通讯,像伺服驱动器或IO站点等。 其中,信捷XLH系列PLC在与松下伺服驱动器通讯时,有一个比较严重的问题,就是PLC断电再上电时,有时候会出现bug,这个bug的现象是,使用PLC的指令方式去控制伺服轴动作时,会产生巨大的…

kali内置超好用的代理工具proxychains

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Mybatis的课程总结

1.mybatis Mybatis主要是对代码进行少写&#xff0c;分别加入核心配置文件和mapper映射文件&#xff0c; 核心配置文件主要是为了连接数据库&#xff0c;mapper映射文件是为了编写sql语句 1.如何配置mybatis ①先创建一个moudle ②然后配置jar包 ③然后进行mybatis的分层 bean…

pcb成型板aoi检测,6种PCB板常用的检测方法

6种PCB板常用的检测方法&#xff0c;主要包括&#xff1a;PCB板人工目测、PCB板在线测试、PCB板功能测试、自动光学检测、自动X光检查、激光检测系统1、PCB板人工目测使用放大镜或校准的显微镜&#xff0c;利用操作人员视觉检查来确定电路板合不合格&#xff0c;并确定什么时候…

我们再次看看 ARB 女巫空投策略,做到知彼知己,不敢说百战不殆

女巫检测选项该项目旨在从 Arbitrum 空投中删除 Sybil 地址&#xff0c;确保只有合法用户才能收到空投代币。方法我们使用链上数据来识别同一用户拥有的相关地址&#xff0c;并使用来自 Nansen、Hop 和 OffChain Labs 的数据删除实体地址&#xff0c;例如网桥、交易所和智能合约…

Verilog学习之触发器与modelsim仿真

目录 一、前言 二、触发器介绍 三、测试文件代码 一、前言 ​ ​本文将学习常见类型触发的verilog编写&#xff0c;结合仿真结果来熟悉。 二、触发器介绍 ​ ​触发器在verilog中的作用主要是具有存储作用&#xff0c;由时钟信号来触发改变存储内容&#xff0c;较常见…

银河麒麟v10系统硬盘挂载

一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10&#xff0c;拿到服务器后使用lsblk -f或fdisk -l命令查看磁盘名称 可以看到sdb200G就是要挂载的硬盘&#xff0c;还没有uuid需要初始化才可以挂载。 二、分区 分区命令&#xff1a; fdisk /dev/【你的…

【LeetCode每日一题】——面试题17.21.直方图的水量

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【时间频度】八【代码实现】九【提交结果】一【题目类别】 双指针 二【题目难度】 困难 三【题目编号】 面试题17.21.直方图的水量 四【题目描述】 给定一个直方图(也称…

Java解题--练习解题阶段(无序阶段)-ALGO-1006 拿金币

题目算法训练 拿金币资源限制内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s问题描述有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以…

什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?

参考答案 1、什么是装箱&#xff1f;什么是拆箱&#xff1f; 装箱&#xff1a;基本类型转变为包装器类型的过程。 拆箱&#xff1a;包装器类型转变为基本类型的过程。 //JDK1.5之前是不支持自动装箱和自动拆箱的&#xff0c;定义Integer对象&#xff0c;必须 Integer i new…

MATLAB | R2023a更新了哪些好玩的东西

R2023a来啦&#xff01;&#xff01;废话不多说看看新版本有啥有趣的玩意和好玩的特性叭&#xff01;&#xff01;把绘图放最前面叭&#xff0c;有图的内容看的人多。。 1 区域填充 可以使用xregion及yregion进行区域填充啦&#xff01;&#xff01; x -10:0.25:10; y x.^…

<Linux>环境变量

环境变量 文章目录环境变量一、基本概念二、常见环境变量三、查看环境变量的方法四、测试PATH五、测试HOME六、测试SHELL七、环境变量相关的命令八、环境变量的组织方式九、命令行参数十、通过代码获得环境变量十一、通过系统调用获取环境变量十二、环境变量通常是具有全局属性…