Django学习(二):数据库操作
参考:最新Python的web开发全家桶(django+前端+数据库)
相较于PyMySQL,Django操作数据库更加简单——ORM框架
由此可见,ORM相当于起到了一种解释器的作用,使得在对数据库操作的代码编写更加简洁明快
1. 安装第三方模块
pip install mysqlclient
2. ORM
ORM可以帮我们做两件事:
- 创建、修改和删除数据库中的表(不用写SQL语句)【无法创建数据库】
- 操作表中的语句(不用写SQL语句)
2.1 自己创建数据库
命令行终端创建
create database mysql_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
2.2 Django连接数据库
在 【settings.py】 中进行配置和修改
找到DATABASES字段
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 连接数据库类型'NAME': 'mysql_test', # 数据库名'USER':'root', # 用户名'PASSWORD':'123456', # 密码'HOST':'127.0.0.1', # 主机地址'PORT':3306, # 端口}
}
2.3 Django表操作
2.3.1 创建表
在【models.py】文件中进行操作,在其中编写类,django会自动在数据库中进行表的创建
步骤:
在【models.py】文件中创建类
在命令行运行
python manage.py makemigrations python manage.py migrate
例子:
## 【models.py】
class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField()
则django自动在数据库中以 【app名_类名小写】创建表,即等同于在mysql中执行:
create table app01_userinfo(id bigint auto_increment primary key,name varchar(32),password varchar(64),age int
)
即 类名 -> 表名 , 字段名 -> 列名
由此可见,在执行上述操作后,包括自己创建app中的类在内的所有在【settings.py】中注册的app都生成了对应的表格
2.3.2 删除表
直接在【models.py】删除创建的类,再执行
python manage.py makemigrations
python manage.py migrate
即可删除表
2.3.3 修改表
若要修改表内的列,直接修改类的成员即可。
若需要删除某一列,直接去掉该成员,再执行下面两条语句
python manage.py makemigrations
python manage.py migrate
【注意】在添加列的时候,因为可能已经存在历史数据,所以需要提前声明该列的默认值,或者允许添加列为空(默认值的声明也可以在执行命令行语句时被动添加),再进行命令行操作
例如:
class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField()level = models.IntegerField(default='2') #设置默认值deta = models.IntegerField(null=True,blank=True) #允许为空
2.4 Django数据操作
2.4.1 添加数据
在【models.py】中编写:
类名.objects.create(键1=值1,键2=值2,...)
例子:向UserInfo中添加行:
UserInfo.objects.create(name="王大壮",password="123",age=22)
在页面中实现
在【views.py】中定义的函数之中,引入【models】模块,对其中的各个类执行上述操作
from app01 import models
def orm(request):#测试ORM操作表中的数据## 1. 新建数据models.Department.objects.create(title="销售部")models.Department.objects.create(title="运营部")models.Department.objects.create(title="IT部")models.UserInfo.objects.create(name="王大壮", password="123", age=22)models.UserInfo.objects.create(name="二狗", password="666", age=6)models.UserInfo.objects.create(name="唐三才", password="789", age=21)models.UserInfo.objects.create(name="赵肆", password="789") # 由于age有默认值,可以不写return HttpResponse("成功")
2.4.2 删除数据
在【views.py】中定义的函数之中,引入【models】模块,对要操作的类,先筛选出需要删除的数据,然后执行delete()
# 2.删除数据# 先筛选数据,然后执行delete()models.UserInfo.objects.filter(id=3).delete()models.Department.objects.all().delete()
2.4.3 获取数据
可以对类的对象使用【.filter()】和【.all()】进行筛选和全选,【.first()】可以直接获取第一个对象
# 3.获取数据data_list = models.UserInfo.objects.all() # 选择所有数据# 返回的data_list是QuerySet类型,可以看作一种数据列表:[行(对象),行(对象),行(对象),...]print(data_list)for obj in data_list:print(obj.id,obj.name,obj.password,obj.age)user_data = models.UserInfo.objects.filter(id=1)#可以使用过滤器来选择想要的数据,过滤器依然返回 QuerySet 即使其只有一个数据user_data = models.UserInfo.objects.filter(id=1).first() #使用first()可以直接取到第一个对象print(user_data.id, user_data.name, user_data.password, user_data.age)
2.4.4 更新数据
对数据进行筛选后,使用【.update()】函数进行修改
# 4.更新数据models.UserInfo.objects.all().update(password=999)models.UserInfo.objects.filter(name='赵肆').update(age=44)
3. 案例:用户管理
3.1 展示用户列表
url
函数
获取数据库中所有用户信息
渲染,传值给页面
#【urls.py】
urlpatterns = [path('info/list/', views.info_list),
]
#【views.py】
from app01.models import UserInfo
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>Info列表</title>
</head>
<body><h1>Info列表</h1><table border = '1'><thead><tr><th>ID</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>
3.2 添加用户
url
函数
GET,看到页面,添加内容
POST,提交->写入数据库
#【urls.py】
urlpatterns = [path('info/add/', views.info_add),
]
#【views.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("/info/list/") #自动跳转到info_list
<!-- 【info_add.html】 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>添加用户</title>
</head>
<body><h1>添加用户</h1><form method="post" action="/info/add/"><!--post当前页面时,action可以不写-->{% csrf_token %} <!-- 别忘了!! --><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>
3.3 删除用户
url
函数
通过url传递nid
get获取nid,删除用户
实现
- 对用户列表页面html进行一些修改
<!-- 【info_list.html】 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Info列表</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><td><a href="/info/delete/?nid={{ obj.id }}">删除</a><!--将本数据的id在跳转时传入delete页面--></td></tr>{% endfor %}</tbody></table><a href="/info/add/">添加</a> <!--实现添加用户页面的跳转-->
</body>
</html>
- 建立连接
#【urls.py】
urlpatterns = [path('info/delete/', views.info_delete),
]
- 根据跳转传入的nid删除数据
#【views.py】
def info_delete(request):nid = request.GET.get('nid')UserInfo.objects.filter(id=nid).delete()return redirect("/info/list/") # 自动跳转到info_list
效果
删除前
删除后
数据库中也已经删除
Django学习(二):数据库操作相关推荐
- 关于Django中的数据库操作API之distinct去重的一个误传
django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...
- Django模型之数据库操作-查询
六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...
- Django框架之数据库操作
文章目录 一.前言 二.数据库配置 三.数据表创建 1.单表创建 2.关联表创建 四.ORM增删改查 1.新增数据(C) (1)创建单表数据 (2)创建从表数据 2.读取数据(R) (1)读取多条数据 ...
- Django模型和数据库操作
文本参考菜鸟教程,创建模型和数据库,并对mysql数据库进行操作. 1.创建数据库 在mysql命令行,输入创建数据库语句. create database runoob default charse ...
- java数据库编程(二) 数据库操作
关于数据库的连接方法已在java 数据库编程(一)JDBC连接Sql Server数据库一文中为大家介绍,还没有链接数据库的小伙伴请先点击查看. 今天首先为大家介绍一下数据库的连接及操作的核心类与接口 ...
- Django学习笔记 ORM操作 From菜鸟教程
# -*- coding: utf-8 -*- #获取数据的多种操作from django.http import HttpResponsefrom TestModel.models import T ...
- django学习笔记--数据库中的多表操作
1.Django数据库----多表的新增操作 1.一对一模式下新增 创建一个详情对象,把这个对象赋值给创建的新的user对象 author_detail = models.AuthorDetail.o ...
- SpringBoot 学习二:操作数据库
2019独角兽企业重金招聘Python工程师标准>>> 本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 Jdbc ...
- Django学习之数据库与ORM
二.ORM表模型 表(模型)的创建: 1.ORM之增(create.save) 一对多(ForeignKey): 多对多(ManyToManyField()): 2.ORM之删(delete) 3.O ...
- Django框架——模型(数据库操作)
-- models.py -- ORM(object-relation mapping) 实现数据模型与数据库的解耦: # 对象,关系,映射: 1.根 据对象的类型生成表结构: 2.将对象.列表的操作 ...
最新文章
- linux shell里面nohup的用法
- (天国之扉文章抢救) 1/10/2003 总结?总结!
- 重磅!GitHub官方App官宣发布了
- Moment.js日期处理库的使用
- 水题 UVA 1586 - Ancient Cipher化学式分子量计算
- python sqlite3事务_python使用上下文管理器实现sqlite3事务机制
- DP! | 不要怂!
- 再次确认输入值、事件绑定实例、输入框内容获取与显示
- java xml二进制流传输_XML中二进制数据的处理方法
- DataTable对象的操作问题
- 机器学习基础-特征工程简析
- 笔记本电脑耳机插入后声音还是外放的解决办法
- 南京银行网站连接不到服务器,南京银行网络准入控制平台
- 计算机网络之网络层- IPv4编址
- Java Web 开发后续(四)
- 如何使用Yii2编程:Google身份验证
- 2022-07-17 Linux group与user基础概念
- 华泰单因子测试之估值类因子(回归法)
- SIPP对Freeswitch进行压力测试
- 【评分卡】评分卡入门与创建原则——分箱、WOE、IV、分值分配