0.说在前面
0.1 Django ORM
Django 模型使用自带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
使用 ORM 的好处:
- 提高开发效率。
- 不同数据库可以平滑切换。
使用 ORM 的缺点:
- ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
- 长期写 ORM 代码,会降低编写 SQL 语句的能力。
ORM 解析过程:
- 1、ORM 会将 Python 代码转成为 SQL 语句。
- 2、SQL 语句通过 pymysql 传送到数据库服务端。
- 3、在数据库中执行 SQL 语句并将结果返回。
ORM 对应关系表:
1.连接数据库
1.1 直接下载MySQL(5.7版本以上)
将端口Port设置为3306,管理员Management User为root,密码Password为123456。
运行以下命令启动MySQL服务。
net start mysql
1.2 通过Docker安装MySQL
Windows Terminal运行以下命令:
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
在Docker container 启动 MySQL服务。
1.3 Django项目连接MySQL数据库
1.3.1 安装MySQLClient
pip install mysqlclient
1.3.2 配置settings文件
打开settings.py项目配置文件
找到DATABASES配置项,并按以下修改:
# settings.py
DATABASES = {
'default': {
# 连接本地mysql数据库
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql', # 你的数据库名
'USER': 'root', # 你的用户名
'PASSWORD': '123456', # 你的密码
'HOST': 'localhost', # 本地连接
'PORT': '3306', # 本地端口号
}
}
2. 建表并进行简单的增删改操作
2.1 建立表格
打开APP下的models.py文件
假设要创建一个评价模块,其中:
需要编码,模块名称,分值
models.py
class Evaluation(models.Model):
id = models.AutoField(primary_key=True, verbose_name="编码")
name = models.CharField(verbose_name="模块名称", max_length=32)
score = models.PositiveIntegerField(verbose_name="分值", max_length=2) # 正整数
在终端运行以下命令:
python manage.py makemigrations
python manage.py migrate
可以看到数据库内以及建好一个名为app01_evalution的表,表的结构如下图所示:
2.2 数据增删改
先于urls.py 文件的urlpatterns添加以下代码:
# urls.py
urlpatterns = [
...,
path('test/add/', views.test_add),
path('test/edit/', views.test_edit),
path('test/delete/', views.test_delete),
path('test/list/', views.test_list),
]
2.2.1 新增数据
新增如下数据
ID | 模板名称 | 分值 |
---|---|---|
1 | 模块1:选择题目 | 20 |
2 | 模块2:掌握情况 | 10 |
3 | Need_TO_DELETE | 0 |
于views.py 添加:
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
def test_add(request):
"""添加评价"""
names = ['模块1:选择题目', '模块2:掌握情况', 'Need_TO_DELETE']
scores = [20, 10, 0]
for i in range(3):
models.Evaluation.objects.create(name=names[i], score=scores[i])
return HttpResponse('添加成功')
浏览器访问 http://localhost:8888/test/add/
可观察到已经有新增的数据:
2.2.2 修改数据
将id为3的数据的score 改为 5
# views.py
def test_edit(request):
"""修改评价"""
models.Evaluation.objects.filter(id=3).update(score=5)
return HttpResponse('修改成功')
浏览器访问http://localhost:8888/test/edit/
2.2.3 删除数据
删除id为3的数据
# views.py
def test_delete(request):
"""删除评价"""
models.Evaluation.objects.filter(id=3).delete()
return HttpResponse('删除成功')
浏览器访问http://localhost:8888/test/delete/
2.2.4 展示所有数据
在Python中输出表中的数据并展示在页面上
def test_list(request):
datas = models.Evaluation.objects.all()
for data in datas:
print(data.id, data.name, data.score)
return render(request, 'test.html', {'datas': datas})
在test.html的nav标签下新增以下代码:
<div class="card">
<div class="card-header">
评价模块
</div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th scope="col">编码</th>
<th scope="col">模块名称</th>
<th scope="col">分值</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
{% for obj in datas %}
<tr>
<th scope="row">{{ obj.id }}</th>
<td>{{ obj.name }}</td>
<td>{{ obj.score }}</td>
<td>
<a href="#" class="btn btn-primary btn-sm">编辑</a>
<a href="#" class="btn btn-danger btn-sm">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
python控制台输出结果为:
浏览器返回如下: