参考:最新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
效果
删除前
删除后
数据库中也已经删除